SOCKET UDP

来源:互联网 发布:php substr_replace 编辑:程序博客网 时间:2024/05/29 17:12

Server:

#include<stdio.h>#include<string.h>#include <stdlib.h>#include<winsock.h>#pragma comment( lib, "ws2_32.lib" )int main(){WSADATA WSAData;if( WSAStartup( MAKEWORD( 1, 1 ), &WSAData ) )//初始化{printf( "initializationing error!\n" );WSACleanup( );exit( 0 );}int socket_server;socket_server=socket(AF_INET,SOCK_DGRAM,0);if(socket_server==-1){perror("socket() error\n");exit(1);}struct sockaddr_in seraddr;seraddr.sin_family=AF_INET;seraddr.sin_port=htons(6000);seraddr.sin_addr.s_addr=htonl(INADDR_ANY);int ans=bind(socket_server,(struct sockaddr*)&seraddr,sizeof(struct sockaddr));if(ans==-1){perror("bind error\n");exit(1);}struct sockaddr_in client;int len=sizeof(struct sockaddr_in);char buf[30];while(1){recvfrom(socket_server,buf,30,0,(struct sockaddr*)&client,&len);//close(socket_tmp);printf("%s\n",buf);sendto(socket_server,"server",30,0,(struct sockaddr*)&client,len);}//closesocket(socket_server);}


Client:

#include<stdio.h>#include<string.h>#include <stdlib.h>#include<winsock.h>#pragma comment( lib, "ws2_32.lib" )int main(){WSADATA WSAData;if( WSAStartup( MAKEWORD( 1, 1 ), &WSAData ) )//初始化{printf( "initializationing error!\n" );WSACleanup( );exit( 0 );}int socket_my;socket_my=socket(AF_INET,SOCK_DGRAM,0);if(socket_my==-1){perror("socket() error\n");exit(1);}int nNetTimeout=1000;setsockopt(socket_my,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); struct sockaddr_in seraddr;seraddr.sin_family=AF_INET;seraddr.sin_port=htons(6000);seraddr.sin_addr.s_addr=inet_addr("127.0.0.1");int len=sizeof(struct sockaddr_in);char buf[30];while(1){sendto(socket_my,"client",30,0,(struct sockaddr*)&seraddr,len);recvfrom(socket_my,buf,30,0,NULL,NULL);printf("%s\n",buf);}}

UDP通信过程如下:

  1. 服务器端绑定一固定udp端口,等待接收客户端的通信。
  2. 客户端通过服务器的ip和地址信息直接对服务器端发送消息。
  3. 服务器端收到客户端发送的消息后获取客户端的ip和端口信息,通过该地址信息和客户端通信。

UDP不能用send和recv函数。这两个示例程序很容易死锁。(示例程序从在脏数据)

如果在Client里没有这两句的话:

setsockopt(socket_my,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); 


recvfrom(socket_my,buf,30,0,NULL,NULL);