c winsock编程中服务器收不到客户端消息
Server cannot receive the clients message in c winsock programming
你好朋友我是 c.I 中套接字编程的新手,在网上阅读了一些教程并开始了 working.The 下面的程序是我在 [=24] 中使用 winsock2 库的套接字客户端和服务器程序=].
每当我运行程序时,没有错误,直到服务器接受客户端connection.But客户端发送消息后,服务器无法接收消息。 WSAGetLastError() 函数 returns 错误代码 10038.I 尝试更改端口,增加和减少消息大小。
帮助我的朋友。
服务器代码
#include<stdio.h>
#include<conio.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsa;
int r;
char buf[4];
WSAStartup(MAKEWORD(2,2),&wsa);
SOCKET s= socket(AF_INET,SOCK_STREAM,0);
if ( s==INVALID_SOCKET)
{
printf("\n failed to create socket error code : %d ",WSAGetLastError());
WSACleanup();
return 1;
}
sockaddr_in sin,cl;
sin.sin_family=AF_INET;
sin.sin_port=htons(80);
sin.sin_addr.s_addr=INADDR_ANY;
if(bind (s,(sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR)
{
printf("\nSocket not Bound\n");
WSACleanup();
return 1;
}
r=listen(s,2);
if(r==SOCKET_ERROR)
{
printf("\nListening Failed\n");
WSACleanup();
return 1;
}
printf("\n Listening\n");
SOCKET client;
r= sizeof(sockaddr_in);
printf("\n Ready to accept");
while (client=accept(s,(sockaddr *)&cl,&r)!= INVALID_SOCKET)
{
printf("\nNew client found\n\n");
if(client == SOCKET_ERROR)
{
printf("\nError connecting client error code : %d ",WSAGetLastError());
WSACleanup();
return 1;
}
r=recv(client,buf,4,0);
if(r==SOCKET_ERROR)
{
printf("\nSocket not connected error code : %d",WSAGetLastError());
WSACleanup();
return 1;
}
printf("%s\n",buf);
}
getchar();
return 0;
}
客户代码
#include <stdio.h>
#include <conio.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa);
int r;
char *buf="data";
SOCKET t=socket(AF_INET,SOCK_STREAM,0);
if(t==SOCKET_ERROR)
{
printf("\nFailed socket error code : %d ",WSAGetLastError());
WSACleanup();
return 1;
}
sockaddr_in server;
server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr("192.168.0.142");
server.sin_port=htons(80);
printf("\nConnecting\n");
r=connect(t,(sockaddr *)&server,sizeof(server));
if(r==SOCKET_ERROR)
{
printf("\nFailed to connect error code : %d ",WSAGetLastError());
WSACleanup();
return 1;
}
printf("\n connected\n");
printf("\nSending data\n");
r=send(t,buf,strlen(buf),0);
if (r==SOCKET_ERROR)
{
printf("\nFailed to connect error code : %d ",WSAGetLastError());
WSACleanup();
return 1;
}
printf("\n Data sent\n");
return 0;
}
首先我们查一下10038是什么意思。
SAENOTSOCK
10038 (0x2736)
An operation was attempted on something that is not a socket.
好的,所以你认为你有一个套接字,但你实际上没有在你的一个电话中。你不是很具体哪个 WSAGetLastError()
函数返回 10038,但我会猜测这个函数之后的调用:
while (client=accept(s,(sockaddr *)&cl,&r)!= INVALID_SOCKET)
在C中,先处理!=
,然后再赋值。因此,您最终将 accept
返回的套接字与 INVALID_SOCKET
进行比较,然后将该布尔值分配给 client
。您希望分配套接字然后进行比较,因此您应该在分配周围使用括号:
while ((client = accept(s,(sockaddr *)&cl,&r)) != INVALID_SOCKET)
此外,socket()
returns INVALID_SOCKET
而不是 SOCKET_ERROR
,尽管巧合地混淆两者不会造成问题。
此外,如果要打印它,则需要在接收端以空值终止字符串。
char buf[5]; /* 4 characters + 1 null-terminator */
...
buf[sizeof(buf) - 1] = '[=13=]'; /* enforce that the buffer is always null terminated regardless of what the sender sends. */
你好朋友我是 c.I 中套接字编程的新手,在网上阅读了一些教程并开始了 working.The 下面的程序是我在 [=24] 中使用 winsock2 库的套接字客户端和服务器程序=].
每当我运行程序时,没有错误,直到服务器接受客户端connection.But客户端发送消息后,服务器无法接收消息。 WSAGetLastError() 函数 returns 错误代码 10038.I 尝试更改端口,增加和减少消息大小。 帮助我的朋友。
服务器代码
#include<stdio.h>
#include<conio.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsa;
int r;
char buf[4];
WSAStartup(MAKEWORD(2,2),&wsa);
SOCKET s= socket(AF_INET,SOCK_STREAM,0);
if ( s==INVALID_SOCKET)
{
printf("\n failed to create socket error code : %d ",WSAGetLastError());
WSACleanup();
return 1;
}
sockaddr_in sin,cl;
sin.sin_family=AF_INET;
sin.sin_port=htons(80);
sin.sin_addr.s_addr=INADDR_ANY;
if(bind (s,(sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR)
{
printf("\nSocket not Bound\n");
WSACleanup();
return 1;
}
r=listen(s,2);
if(r==SOCKET_ERROR)
{
printf("\nListening Failed\n");
WSACleanup();
return 1;
}
printf("\n Listening\n");
SOCKET client;
r= sizeof(sockaddr_in);
printf("\n Ready to accept");
while (client=accept(s,(sockaddr *)&cl,&r)!= INVALID_SOCKET)
{
printf("\nNew client found\n\n");
if(client == SOCKET_ERROR)
{
printf("\nError connecting client error code : %d ",WSAGetLastError());
WSACleanup();
return 1;
}
r=recv(client,buf,4,0);
if(r==SOCKET_ERROR)
{
printf("\nSocket not connected error code : %d",WSAGetLastError());
WSACleanup();
return 1;
}
printf("%s\n",buf);
}
getchar();
return 0;
}
客户代码
#include <stdio.h>
#include <conio.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa);
int r;
char *buf="data";
SOCKET t=socket(AF_INET,SOCK_STREAM,0);
if(t==SOCKET_ERROR)
{
printf("\nFailed socket error code : %d ",WSAGetLastError());
WSACleanup();
return 1;
}
sockaddr_in server;
server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr("192.168.0.142");
server.sin_port=htons(80);
printf("\nConnecting\n");
r=connect(t,(sockaddr *)&server,sizeof(server));
if(r==SOCKET_ERROR)
{
printf("\nFailed to connect error code : %d ",WSAGetLastError());
WSACleanup();
return 1;
}
printf("\n connected\n");
printf("\nSending data\n");
r=send(t,buf,strlen(buf),0);
if (r==SOCKET_ERROR)
{
printf("\nFailed to connect error code : %d ",WSAGetLastError());
WSACleanup();
return 1;
}
printf("\n Data sent\n");
return 0;
}
首先我们查一下10038是什么意思。
SAENOTSOCK
10038 (0x2736)
An operation was attempted on something that is not a socket.
好的,所以你认为你有一个套接字,但你实际上没有在你的一个电话中。你不是很具体哪个 WSAGetLastError()
函数返回 10038,但我会猜测这个函数之后的调用:
while (client=accept(s,(sockaddr *)&cl,&r)!= INVALID_SOCKET)
在C中,先处理!=
,然后再赋值。因此,您最终将 accept
返回的套接字与 INVALID_SOCKET
进行比较,然后将该布尔值分配给 client
。您希望分配套接字然后进行比较,因此您应该在分配周围使用括号:
while ((client = accept(s,(sockaddr *)&cl,&r)) != INVALID_SOCKET)
此外,socket()
returns INVALID_SOCKET
而不是 SOCKET_ERROR
,尽管巧合地混淆两者不会造成问题。
此外,如果要打印它,则需要在接收端以空值终止字符串。
char buf[5]; /* 4 characters + 1 null-terminator */
...
buf[sizeof(buf) - 1] = '[=13=]'; /* enforce that the buffer is always null terminated regardless of what the sender sends. */