udp socket通信
来源:互联网 发布:mac迅雷影音播放器 编辑:程序博客网 时间:2024/06/05 03:48
client端:
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <pthread.h> #define PORT 7089 #define BUFFER_SIZE 1024 int sockfd,sendbytes,recvbytes; char buf[BUFFER_SIZE]; char ip[36]; char message[72]; struct hostent *host; struct sockaddr_in serv_addr; void *thrd_recv() { int addr_len=sizeof(serv_addr); while(1){ memset(buf , 0, sizeof(buf)); if ((recvbytes = recvfrom(sockfd, buf, BUFFER_SIZE, 0, (struct sockaddr *)&serv_addr, (socklen_t*)&addr_len)) == -1) { perror("recv"); exit(1); } printf("Received a message: %s\n", buf); } } int main() { pthread_t thread[1]; printf("请输入对方 IP 或者主机名\n"); scanf("%s",&ip); printf("对方 IP 或者主机名是:%s\n",ip); if ((host = gethostbyname(ip) )== NULL) { perror("gethostbyname"); exit(1); } /*创建 socket*/ if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } /*设置 sockaddr_in 结构体中相关参数*/ serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); serv_addr.sin_addr = *((struct in_addr *)host->h_addr); bzero(&(serv_addr.sin_zero), 8); /*调用 connect 函数主动发起对服务器端的连接*/ while(1){ pthread_create(&thread[0],NULL,thrd_recv,(void*)0); memset(buf, 0, sizeof(buf)); printf("请输入 message:\n"); scanf("%s",&message); sprintf(buf, "%s", message); /*发送消息给服务器端*/ if ((sendbytes = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr))) == -1) { perror("sendto"); exit(1); } } close(sockfd); exit(0); }
要注意的是:udp客户端连接服务端时,服务端并不知道客户端的端口号,因为客户端的udp端口号是系统自动分配的,所以服务端不能先发送数据给客户端。因此只有当客户端先发送数据给服务端,服务端才能知道客户端的udp端口号。
为了解决此问题,客户端可自己设定udp端口号,也就是监听端口。添加bind函数即可:
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <pthread.h> #define PORT 7089 #define BUFFER_SIZE 1024 int sockfd,sendbytes,recvbytes; char buf[BUFFER_SIZE]; char ip[36]; char message[72]; struct hostent *host; struct sockaddr_in serv_addr; struct sockaddr_in serverGet; void *thrd_recv() { int addr_len=sizeof(serv_addr); int getlen=sizeof(serverGet); while(1){ memset(buf , 0, sizeof(buf)); if ((recvbytes = recvfrom(sockfd, buf, BUFFER_SIZE, 0, (struct sockaddr *)&serverGet, (socklen_t*)&getlen)) == -1) { perror("recv"); exit(1); } printf("Received a message: %s\n", buf); } } int main() { pthread_t thread[1]; printf("请输入对方 IP 或者主机名\n"); scanf("%s",&ip); printf("对方 IP 或者主机名是:%s\n",ip); if ((host = gethostbyname(ip) )== NULL) { perror("gethostbyname"); exit(1); } /*创建 socket*/ if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } /*设置 sockaddr_in 结构体中相关参数*/ serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); serv_addr.sin_addr = *((struct in_addr *)host->h_addr); bzero(&(serv_addr.sin_zero), 8); /*调用 bind 函数绑定本地监听端口,这里是7089*/ int getlen=sizeof(serverGet); serverGet.sin_family=AF_INET; serverGet.sin_port=htons(7089); serverGet.sin_addr.s_addr=INADDR_ANY; bind(sockfd,(struct sockaddr*)&serverGet,getlen); while(1){ pthread_create(&thread[0],NULL,thrd_recv,(void*)0); memset(buf, 0, sizeof(buf)); printf("请输入 message:\n"); scanf("%s",&message); sprintf(buf, "%s", message); /*发送消息给服务器端*/ if ((sendbytes = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr))) == -1) { perror("sendto"); exit(1); } } close(sockfd); exit(0); }
阅读全文
0 0
- socket通信---UDP通信
- socket网络通信(udp)
- socket网络通信(udp)
- mfc socket udp通信
- UDP Socket通信学习
- Socket ( Udp) 通信服务端
- socket (UDP通信)
- socket udp通信
- Socket之UDP通信
- UDP通信socket编程
- socket实现UDP通信
- UDP之socket通信
- Android:Socket UDP通信
- socket之UDP通信
- Unity3D Socket通信 UDP
- udp socket通信
- socket通信,tcp,udp通信
- UDP socket (UDP套接口通信)
- 如何使用 Charles 抓包并分析 Http 报文
- Bootstrap typeahead使用问题记录及解决方案
- js获取json数据Object对象的长度
- python学习笔记(十四)——栈和队列
- 02oracle学习笔记
- udp socket通信
- 学习opencv随记1
- ORM是什么?如何理解ORM
- 解决Xshell连接Linux服务器总掉线的问题
- The program 'rz' is currently not installed. You can install it by typing: apt-get install lrzsz
- pygame中绘制线条的方法
- 1191: IDrandom的奇淫巧计
- centos下安装gcc
- 比特币挖矿——入门