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通信过程如下:
- 服务器端绑定一固定udp端口,等待接收客户端的通信。
- 客户端通过服务器的ip和地址信息直接对服务器端发送消息。
- 服务器端收到客户端发送的消息后获取客户端的ip和端口信息,通过该地址信息和客户端通信。
UDP不能用send和recv函数。这两个示例程序很容易死锁。(示例程序从在脏数据)
如果在Client里没有这两句的话:
setsockopt(socket_my,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
recvfrom(socket_my,buf,30,0,NULL,NULL);