服务器端:server_udp.c
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>
#define SERVPORT 3333 //服务器监听端口号#define BACKLOG 10 //最大同时连接请求数
/*//用于接收数据的线程//形参:argv为一个socked句柄void * threadFunc(void * argv) { int csocket; int ret; char buf[512]; int len = sizeof(adr_send); //用于保存adr_clnt大小
csocket = *(int*)argv;
while(1) { //recv(csocket, buf, 512, 0); ret = recvfrom(csocket, buf, sizeof(buf), 0, (struct sockaddr*)&adr_send, &len );; //接收客户端传来的数据 if(ret == -1){ perror("recvfrom failed/n"); exit(1); } buf[ret] = '/0'; //最后1位设置为结束符 printf("接收:%s", buf); if( strncmp(buf, "stop", 4) == 0){ //若接收到stop,退出 printf("结束.../n"); break; } }
return NULL;}*/
int main(){ pthread_t pid; //定义一个线程id int sockfd; //定义一个socked句柄 char buf[256]; //接收数据缓存区 struct sockaddr_in adr_inet; //本地socket信息 struct sockaddr_in adr_clnt; //客户端socket信息 int ret; //用于保存返回值 int len = sizeof(adr_clnt); //用于保存adr_clnt大小
printf("等待客户端.../n"); //初始化本地socket信息 adr_inet.sin_family = AF_INET; //IPv4协议 adr_inet.sin_port = htons(SERVPORT); //端口号,使用htons函数转换 adr_inet.sin_addr.s_addr = INADDR_ANY; //IP地址为0.0.0.0 bzero(&(adr_inet.sin_zero), 8); //用bzero函数将sin_zero置零 sockfd = socket(AF_INET, SOCK_DGRAM, 0); //建立数据报socket(即UDP) if(sockfd == -1){ perror("socked failed/n"); exit(1); }
ret = bind(sockfd, (struct sockaddr*)&adr_inet, sizeof(adr_inet)); //绑定socket if(ret == -1){ perror("bind failed/n"); exit(1); }
// pthread_create(&pid, NULL, threadFunc, (void *)&socket);
while(1){ ret = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&adr_clnt, &len ); //接收客户端传来的数据 if(ret == -1){ perror("recvfrom failed/n"); exit(1); } buf[ret] = '/0'; //最后1位设置为结束符 printf("接收:%s", buf); if( strncmp(buf, "stop", 4) == 0){ //若接收到stop,退出 printf("结束.../n"); break; }
}
close(sockfd); //关闭socked
return 0;}
客户端:client_udp.c
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <string.h>
#define SERVPORT 3333
int main(){ int sockfd; char buf[80]; struct sockaddr_in adr_serv; //服务器端socket信息 int ret;
printf("连接服务器端.../n"); //初始化服务器socket信息 adr_serv.sin_family = AF_INET; adr_serv.sin_port = htons(SERVPORT); adr_serv.sin_addr.s_addr = INADDR_ANY; bzero(&(adr_serv.sin_zero), 8); sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd == -1){ perror("socket failed/n"); exit(1); } printf("发送数据.../n"); while(1){ //scanf("%s", buf); fgets(buf, 80, stdin); ret = sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&adr_serv, sizeof(adr_serv) ); //发送数据到服务器端 if(ret < 0){ perror("sendto failed/n"); exit(1); }
if(strncmp(buf, "stop", 4) == 0){ printf("结束发送.../n"); break; } } close(sockfd); return 0;}
