socket编程,为什么recv函数一直都只能接收到一个字节

lq1115 2016-03-11 11:17:18

以下是源码
主要是红字部分

Server
#include<winsock2.h>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#pragma comment(lib,"ws2_32.lib")
DWORD WINAPI TheadProc(LPVOID lp)
{
SOCKET *s2=(SOCKET*)lp;
char buffer[100];
while(1)
{
gets(buffer);
send((*s2),buffer,100,0);
memset(buffer,100,0);
}
return 0;
}
int main()
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2,2),&wsadata);

SOCKET s1;
s1=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(1234);
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

bind(s1,(SOCKADDR*)&addr,sizeof(SOCKADDR));
listen(s1,5);
printf("服务器开启\n正在等待连接......\n");

int len=sizeof(SOCKADDR);
char buffer[100];
SOCKET s2=accept(s1,NULL,&len);
CreateThread(NULL,0,TheadProc,(LPVOID)&s2,0,NULL);
while( int k=recv(s2,buffer,sizeof(buffer),0)>0)
{
printf("客户端:%s %d字节\n",buffer,k);
memset(buffer,100,0);
}

closesocket(s2);
closesocket(s1);
WSACleanup();
return 0;
}



Client
#include<winsock2.h>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#pragma comment(lib,"ws2_32.lib")
DWORD WINAPI TheadProc(LPVOID lp)
{
SOCKET *s2=(SOCKET*)lp;
char buffer[100];
while(recv((*s2),buffer,100,0)>0)
{
printf("服务器:%s\n",buffer);
memset(buffer,100,0);
}
closesocket(*s2);
return 0;
}
int main()
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2,2),&wsadata);

SOCKET s1;
s1=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(1234);
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

connect(s1,(SOCKADDR*)&addr,sizeof(SOCKADDR));
printf("客户端开启\n连接成功......\n");

int len=sizeof(SOCKADDR);
char buffer[100];
CreateThread(NULL,0,TheadProc,(LPVOID)&s1,0,NULL);
while(1)
{

gets(buffer);
send(s1,buffer,sizeof(buffer),0);
}
//memset(buffer,100,0);
closesocket(s1);
WSACleanup();
return 0;
}
...全文
673 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-03-14
  • 打赏
  • 举报
回复
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。
pengzhixi 2016-03-11
  • 打赏
  • 举报
回复
int k=recv(s2,buffer,sizeof(buffer),0)>0 注意到优先级了没 > 和=
赵4老师 2016-03-11
  • 打赏
  • 举报
回复
while( int k=recv(s2,buffer,sizeof(buffer),0)>0)
{
    printf("客户端:%d字节\n",k);
    for (int i=0;i<k;i++) printf(" %02x",(unsigned char)buffer[i]);
    printf("\n");
    memset(buffer,100,0);
    Sleep(100);
}
cocoabird 2016-03-11
  • 打赏
  • 举报
回复
int k=recv(s2,buffer,sizeof(buffer),0) while(k) {}

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧