【发布时间】:2015-11-28 19:19:17
【问题描述】:
你好朋友我是csocket编程的新手,我在网上看了一些教程并开始工作。下面的程序是我在WINDOWS中使用winsock2库的socket客户端和服务器程序。
每当我运行程序时,在服务器接受客户端连接之前没有错误。但是在客户端发送消息后,服务器无法接收消息。 WSAGetLastError() 函数返回错误代码为 10038。我尝试更改端口,增加和减少消息大小。 朋友们帮帮我。
服务器代码
#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;
}
【问题讨论】:
-
您必须注意的一件事是,C 中的字符串是以空值结尾的,这意味着在标记结束位置的字符串之后有一个符号
\0。所以"data"的strlen()是4,因为它有4 个字符,但它的总大小实际上是5 个字节。您也必须发送\0,否则服务器端的buf将不是有效的C 字符串,当您尝试printf()时可能会导致未定义的行为。 -
另外,如果不指定协议,我不知道你会得到什么样的行为。在这种情况下,
socket()似乎应该接收IPPROTO_TCP作为第三个参数,而不是0。 -
ZeroMQ 值得一看。这是一种比处理原始套接字更容易使用网络连接的方法。查看zeromq.org/distro:microsoft-windows 进行下载,并搜索“ZeroMQ 指南”。
标签: c sockets winsock winsock2