BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #30169同步于 2009/10/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于C语言实现的客户端和服务器端通信问题!我很急可又很笨。。

lijiting
2009/10/21镜像同步8 回复
下面是一段客户端代码,我的目的是要它能把一个结构体发送到服务器端,请高手帮忙! 结构体可以是下面这个: typedef struct tagPINGBT { u_long handle; char *hostname; char *pcAddress; u_short usByte; u_long ulTime; u_short usTTL; u_long usreturnType; }PINGBT_S, *pPing; 客户端代码: #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32") struct sockaddr_in server; int serverlen=sizeof(server); char ip[15]; void main() { SOCKET socket1; WSADATA wsaData; if(WSAStartup(MAKEWORD(2,1),&wsaData)) { printf("Winsock无法初始化!\n"); WSACleanup(); return; } printf("客户端开始创建SOCKET。\n"); printf("请输入服务端IP地址:\n"); scanf("%s",ip); server.sin_family=AF_INET; server.sin_port=htons(27015); server.sin_addr.S_un.S_addr=inet_addr(ip); socket1=socket(AF_INET,SOCK_DGRAM,0); while(1) { char buffer[1024]="\0"; printf("Please input messages:\n"); scanf("%s",buffer); if(strcmp(buffer,"bye")==0) { printf("Quit!\n"); closesocket(socket1); break; } if(sendto(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&server,serverlen)!=SOCKET_ERROR) { if(recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&server,&serverlen)!=SOCKET_ERROR) printf("receive from server: %s\n",buffer); } } closesocket(socket1); WSACleanup(); } 服务器端代码: #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32") struct sockaddr_in local,from; int fromlen=sizeof(from); void main() { SOCKET socket1; WSADATA wsaData; if(WSAStartup(MAKEWORD(2,1),&wsaData)) { printf("Winsock无法初始化!\n"); WSACleanup(); return; } printf("服务器开始创建SOCKET。\n"); local.sin_family=AF_INET; local.sin_port=htons(27015); local.sin_addr.S_un.S_addr=INADDR_ANY; socket1=socket(AF_INET,SOCK_DGRAM,0); bind(socket1,(struct sockaddr*)&local,sizeof(local)); while(1) { char buffer[1024]="\0"; printf("waiting for message from others...\n"); if(recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR) { printf("Received datagram from %s-%s\n",inet_ntoa(from.sin_addr),buffer); sendto(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&from,fromlen); } } closesocket(socket1); WSACleanup(); }
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
django机器人#1 · 2009/10/21
windows socket啊,不会,等牛人吧。
jmpesp机器人#2 · 2009/10/21
【 在 lijiting 的大作中提到: 】 : 下面是一段客户端代码,我的目的是要它能把一个结构体发送到服务器端,请高手帮忙! : 结构体可以是下面这个: : typedef struct tagPINGBT : ................... 什么问题?总要说清楚吧。。。
levin108机器人#3 · 2009/10/21
lz什么意思啊,要发结构体到服务器,struct却定义了就放在那里从来都没有用过
lijiting机器人#4 · 2009/10/21
【 在 levin108 的大作中提到: 】 : lz什么意思啊,要发结构体到服务器,struct却定义了就放在那里从来都没有用过 就是想让你帮改一下程序,能发送那个结构体
SuK机器人#5 · 2009/10/21
sendto 只能接收char的内容? 那样的话,需要在发端写一个将结构体转成char*的函数。(比如用分号来分隔字段) 然后在收端写一个解析程序把收到的串转换成结构。 看你结构都是char或者数字,应该不难。
braveheart机器人#6 · 2009/10/21
把结构体用xml封装后再进行传输吧
levin108机器人#7 · 2009/10/22
不用那么麻烦吧 我记得sendto接收的第一个参数是void*类型的,你放进去什么它都能给你发送,结构体也好,类也好,都没问题,比如: PINGT_S ss; ....//初始化ss sendto(&ss,sizeof(PINGT_S),0,..,..); 或者把结构体转换成比特数组发送 typedef unsigned char uint8_t; uint8_t *data=new uint8_t[sizeof(PINGT_S)]; memcpy(data,&ss,sizeof(PINGT_S)); sendto(data,sizeof(PINGT_S),0...); 第二种方法可以在结构体后面粘贴其它的信息,比如一个RTP包除了头之外还需要贴上它的payload,payload不是在header struct里面定义的,这样就可以把header struct转换成uint8_t[] 然后在后面直接贴止payload信息一起发送 我在linux下一直都是这么干的,估计win下也差不了多少吧,呵呵,仅供参考
a3213105机器人#8 · 2009/10/22
结构体中有char*,不能直接发送,需要自己先把结构体变成数据块发送,服务器端再接受解包成结构体