当前位置: 技术问答>linux和unix
关于linux下socket编程的问题,高手入。
来源: 互联网 发布时间:2016-10-07
本文导语: 最近在写一个迷你QQ程序,通过epoll和socket配合实现, 问题挺奇怪的, 一开始我发送的 注册或者登陆数据包都没有任何错误,服务器,客户端实现了良好通信, 接着登陆之后,客户端向服务器发送了一个 聊天信息...
最近在写一个迷你QQ程序,通过epoll和socket配合实现,
问题挺奇怪的,
一开始我发送的 注册或者登陆数据包都没有任何错误,服务器,客户端实现了良好通信,
接着登陆之后,客户端向服务器发送了一个 聊天信息 用 sendMsg 封装处理,然后发送,
服务器端用 packetDeal 先识别包的类型,然后进行特定处理。
但是,错误出现在,客户端发送数据包后,服务器接受的数据包类型成了登陆时输入的ID
感觉非常神奇,望高手解答。谢谢
客户端发送的程序段:
服务器接受的程序端
问题挺奇怪的,
一开始我发送的 注册或者登陆数据包都没有任何错误,服务器,客户端实现了良好通信,
接着登陆之后,客户端向服务器发送了一个 聊天信息 用 sendMsg 封装处理,然后发送,
服务器端用 packetDeal 先识别包的类型,然后进行特定处理。
但是,错误出现在,客户端发送数据包后,服务器接受的数据包类型成了登陆时输入的ID
感觉非常神奇,望高手解答。谢谢
客户端发送的程序段:
int sendMsg() //鍙戦€佹秷鎭暟鎹墦鍖?
{
CHAT chatData;
PREQ reqData;
char cId[11],msg[141];
int sendState;
memset(&chatData, 0, sizeof(CHAT));
scanf("%s",cId);
chatData.dstID = atoi(cId);
chatData.srcID = clientInfo.ID;
strcpy(chatData.srcNickname, clientInfo.nickname);
scanf("%s",msg);
strcpy(chatData.msg, msg);
chatData.sendTime = time(NULL);
reqData = (PREQ)calloc( sizeof(int)+
sizeof(enum REQTYPE)+sizeof(CHAT), 1);
reqData->length = sizeof(CHAT);
reqData->reqType = chat;
memcpy(reqData->buf, &chatData, sizeof(CHAT));
sendState = write(clientInfo.socket, &reqData, sizeof(int)+
sizeof(enum REQTYPE)+sizeof(CHAT));
//vestigeInfo
DEBUG("length:%d,reqType:%d,msg:%sn",
(int)(*((int *)reqData)),
(enum REQTYPE)(*((int *)reqData+1)),
((CHAT *)reqData->buf)->msg);
if(sendState == -1)
{
perror("sendMsg:send");
}
else{
DEBUG("sendMsg:send successn");
}
free(reqData);
}
服务器接受的程序端
int packetDeal(int sockfd)
{
REQ reqData;
PCLIENT pclientNode = clientList;
PCLIENT qclientNode = clientList;
memset(&reqData, 0, sizeof(REQ));
int ret = recv(sockfd, &reqData, sizeof(REQ), MSG_PEEK);
if(ret next != NULL)
{
pclientNode = qclientNode;
qclientNode = qclientNode->next;
if(qclientNode->socket == sockfd)
{
pclientNode->next = qclientNode->next;
free(qclientNode);
break;
}
}
pthread_mutex_unlock(&clLock);
close(sockfd);
return 0;
}
//vestigeInfo
DEBUG("packetDeal %d, sockfd:%dn",reqData.reqType, sockfd);
switch(reqData.reqType)
{
case regist:
//vestigeInfo
DEBUG("REGISTn");
regist_func(sockfd);
break;
case login:
//vestigeInfo
DEBUG("LOGINn");
login_func(sockfd);
break;
case chat:
//vestigeInfo
DEBUG("CHATn");
chat_func(sockfd);
break;
case sendFile:
//vestigeInfo
DEBUG("SENDFILEn");
sendFile_func(sockfd);
break;
case set:
//vestigeInfo
DEBUG("SETn");
set_func(sockfd);
break;
}
}
|
怀疑与这句话有关
reqData = (PREQ)calloc( sizeof(int)+ sizeof(enum REQTYPE)+sizeof(CHAT), 1);
由于内存对其的原因,整个结构体的大小不一定是每个成员大小之和
分配内存的大小直接用sizeof(结构体),试试看
reqData = (PREQ)calloc( sizeof(int)+ sizeof(enum REQTYPE)+sizeof(CHAT), 1);
由于内存对其的原因,整个结构体的大小不一定是每个成员大小之和
分配内存的大小直接用sizeof(结构体),试试看
|
看代码头疼 不会是感冒的原因吧。
|
不会,一般神奇的问题都是应用程序本身造成的
你用MSG_PEEK标志来接收数据,是不是前面的处理,比如登录过程,将数据从TCP的缓冲区复制出来之后数据留在缓冲区,而下一次你读到的实际上是上一次的数据呢
你用MSG_PEEK标志来接收数据,是不是前面的处理,比如登录过程,将数据从TCP的缓冲区复制出来之后数据留在缓冲区,而下一次你读到的实际上是上一次的数据呢