UDP使用connect()
2017-11-21 20:57
441 查看
一般的UDP简单连接
在《TCP/IP网络实验程序篇》这本书中看到:
“在TCP/IP协议中,如果执行connect系统调用,则发送一个建立连接请求的SYN段。在UDP协议中也可以执行connect系统调用,但是,此时不传输任何一个包。在UDP协议中,如果执行一个connect系统调用,那么使用该套接字所进行的通信,只限定于与特定的对方(IP地址,端口号)进行通信。这样做的结果,并不需要每次都使用设定对方地址的sendto系统调用或者获得对方地址recvfrom系统调用,而只需要使用send或recv系统调用即可。”
试了一下:
client:#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#define MAXMSG 1024
int main()
{
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd < 0)
{
perror("socket");
exit(1);
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6666);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(connect(sockfd,(struct sockaddr*)&addr,sizeof(addr)) == -1)
{
perror("connect");
exit(1);
}
char sendBuf[MAXMSG],recvBuf[MAXMSG];
while(fgets(sendBuf,MAXMSG,stdin) != NULL)
{
send(sockfd,sendBuf,strlen(sendBuf),0);
if(strcmp(sendBuf,"exit\n") == 0)
break;
recv(sockfd,recvBuf,MAXMSG,0);
printf("recv from server: %s\n",recvBuf);
}
return 0;
}
server:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXMSG 1024
int main()
{
int sockfd,nbytes;
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd < 0)
{
perror("socket");
exit(1);
}
socklen_t size;
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6666);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)) < 0)
{
perror("bind");
exit(1);
}
char message[MAXMSG];
while(1)
{
size = sizeof(addr);
int len = recvfrom(sockfd,message,MAXMSG,0,(struct sockaddr*)&addr,&size);
if(len < 0)
{
perror("recvfrom");
exit(1);
}
if(strcmp(message,"exit\n") == 0)
break;
printf("recvfrom client: %s\n",message);
sendto(sockfd,message,len,0,(struct sockaddr*)&addr,size);
memset(message,0,sizeof(message));
}
close(sockfd);
return 0;
}
client的addr.sin_port其实记录的是client要通信的server的端口号,IP地址也是server端的
在《TCP/IP网络实验程序篇》这本书中看到:
“在TCP/IP协议中,如果执行connect系统调用,则发送一个建立连接请求的SYN段。在UDP协议中也可以执行connect系统调用,但是,此时不传输任何一个包。在UDP协议中,如果执行一个connect系统调用,那么使用该套接字所进行的通信,只限定于与特定的对方(IP地址,端口号)进行通信。这样做的结果,并不需要每次都使用设定对方地址的sendto系统调用或者获得对方地址recvfrom系统调用,而只需要使用send或recv系统调用即可。”
试了一下:
client:#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#define MAXMSG 1024
int main()
{
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd < 0)
{
perror("socket");
exit(1);
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6666);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(connect(sockfd,(struct sockaddr*)&addr,sizeof(addr)) == -1)
{
perror("connect");
exit(1);
}
char sendBuf[MAXMSG],recvBuf[MAXMSG];
while(fgets(sendBuf,MAXMSG,stdin) != NULL)
{
send(sockfd,sendBuf,strlen(sendBuf),0);
if(strcmp(sendBuf,"exit\n") == 0)
break;
recv(sockfd,recvBuf,MAXMSG,0);
printf("recv from server: %s\n",recvBuf);
}
return 0;
}
server:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXMSG 1024
int main()
{
int sockfd,nbytes;
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd < 0)
{
perror("socket");
exit(1);
}
socklen_t size;
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6666);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)) < 0)
{
perror("bind");
exit(1);
}
char message[MAXMSG];
while(1)
{
size = sizeof(addr);
int len = recvfrom(sockfd,message,MAXMSG,0,(struct sockaddr*)&addr,&size);
if(len < 0)
{
perror("recvfrom");
exit(1);
}
if(strcmp(message,"exit\n") == 0)
break;
printf("recvfrom client: %s\n",message);
sendto(sockfd,message,len,0,(struct sockaddr*)&addr,size);
memset(message,0,sizeof(message));
}
close(sockfd);
return 0;
}
client的addr.sin_port其实记录的是client要通信的server的端口号,IP地址也是server端的
相关文章推荐
- 使用UDP的connect获取本机IP
- 使用udp_client或者udp_connect和udp_server 的时间获取函数
- UDP socket编程中使用connect
- 在udp中使用connect:
- UDP 使用 connect
- UDP使用connect系统调用
- UDP 配合 connect 的使用
- 在UDP中使用connect
- connect()函数不是TCP的专用,UDP中同样可以使用
- UDP中使用connect
- UDP中使用bind和connect的作用
- UDP socket也可以使用connect系统调用
- UDP 服务端与客户端均可以bind()绑定端口, 并且可以使用connect()链接后,使用send()与recv()方法!
- UDP协议中是否可以使用connect
- UDP服务器也可以使用connect()
- UDP 配合 connect 的使用
- UDP socket也可以使用connect系统调用
- UDP中使用connect
- 在MySQL中使用init-connect与binlog来实现用户操作追踪记录
- Java 使用udp协议发送数据