返回信息流下面是一段客户端代码,我的目的是要它能把一个结构体发送到服务器端,请高手帮忙!
结构体可以是下面这个:
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();
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #30169同步于 2009/10/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于C语言实现的客户端和服务器端通信问题!我很急可又很笨。。
lijiting
2009/10/21镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
【 在 lijiting 的大作中提到: 】
: 下面是一段客户端代码,我的目的是要它能把一个结构体发送到服务器端,请高手帮忙!
: 结构体可以是下面这个:
: typedef struct tagPINGBT
: ...................
什么问题?总要说清楚吧。。。
【 在 levin108 的大作中提到: 】
: lz什么意思啊,要发结构体到服务器,struct却定义了就放在那里从来都没有用过
就是想让你帮改一下程序,能发送那个结构体
sendto 只能接收char的内容?
那样的话,需要在发端写一个将结构体转成char*的函数。(比如用分号来分隔字段)
然后在收端写一个解析程序把收到的串转换成结构。
看你结构都是char或者数字,应该不难。
不用那么麻烦吧
我记得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下也差不了多少吧,呵呵,仅供参考