小弟刚学winsock,仿照别人的程序做了一个echo程序,运行时能看到客户端的IP及端口,但却接受不到客户端发来的数据,总是提示:recv() failed:10038 ,返回值为-1.服务端程序如下,请各位帮忙看一下,是什么地方有问题,先谢过了.
#pragma comment(lib, "WS2_32.lib")
#include <winsock.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<iostream.h>#define MaxCon 5 /*maxinum connection*/
#define BUFSIZE 4096
#define DEFAULT_PORT 2008
#define WSVERS MAKEWORD(2,0)BOOL bRecvOnly = FALSE; // Receive data only; don't echo back
void errexit(const char * format,...);
DWORD WINAPI ClientThread(LPVOID lpParam);int main( int argc , char *argv[])
{
char *service="echo";
struct sockaddr_in Serveraddr;
int Sock_listen,type,bindOK;
HANDLE hThread;
DWORD dwThreadId; WSADATA wsadata;
if(WSAStartup(WSVERS,&wsadata)!=0)
errexit("WSAStartup failed\n");
type=SOCK_STREAM;
Sock_listen=socket(PF_INET,type,0);
if (Sock_listen == INVALID_SOCKET)
errexit("can't create socket: %d\n", GetLastError()); memset(&Serveraddr,0,sizeof(Serveraddr));
Serveraddr.sin_family=AF_INET;
Serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
Serveraddr.sin_port=htons(DEFAULT_PORT);
bindOK=bind(Sock_listen,(struct sockaddr *)&Serveraddr,sizeof(Serveraddr));
if (bindOK != 0)
errexit("can't create binding: %d\n", GetLastError()); if(listen(Sock_listen,MaxCon)!=0)
errexit("can't create listening: %d\n", GetLastError()); struct sockaddr_in Clientaddr;
SOCKET client;
int clilen=sizeof(Clientaddr);
while(true)
{
char temp[BUFSIZE]; client=accept(Sock_listen,
(struct sockaddr*)&Clientaddr,&clilen);
printf("visited client: %s:%d\n",
inet_ntoa(Clientaddr.sin_addr), ntohs(Clientaddr.sin_port));
sprintf(temp,"Your IP is %s:%d\r\n",inet_ntoa(Clientaddr.sin_addr), ntohs(Clientaddr.sin_port));
send(client,temp,strlen(temp),0); strcpy(temp,"hello!this is the server!");
send(client,temp,strlen(temp),0);
hThread = CreateThread(NULL, 0, ClientThread,
(LPVOID)client, 0, &dwThreadId);
if (hThread == NULL)
{
printf("CreateThread() failed: %d\n", GetLastError());
break;
}
CloseHandle(hThread); closesocket(client);
} closesocket(Sock_listen);
WSACleanup();
return 0;
}
DWORD WINAPI ClientThread(LPVOID lpParam)
{
SOCKET s=(SOCKET)lpParam;
char Buf[BUFSIZE+1];
int ret,nLeft,px;
printf("Thread open,socket is %d",s);
while(true)
{
ret = recv(s, Buf, BUFSIZE, 0);
printf("here ret is%d",ret);
if (ret == 0)
break;
else if (ret == SOCKET_ERROR)
{
printf("recv() failed: %d\n", WSAGetLastError());
break;
}
Buf[ret] = '\0';
printf("RECV: '%s'\n", Buf); if (!bRecvOnly)
{
nLeft = ret;
px = 0; while(nLeft>0)
{
ret = send(s, &Buf[px], nLeft, 0);
if (ret == 0)
break;
else if (ret == SOCKET_ERROR)
{
printf("send() failed: %d\n",
WSAGetLastError());
break;
}
nLeft -= ret;
px += ret;
}
}
}
return 0;
}
void errexit(const char * format,...)
{
va_list args;
va_start(args,format);
vfprintf(stderr,format,args);
va_end(args);
WSACleanup();
exit(1);
}
#pragma comment(lib, "WS2_32.lib")
#include <winsock.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<iostream.h>#define MaxCon 5 /*maxinum connection*/
#define BUFSIZE 4096
#define DEFAULT_PORT 2008
#define WSVERS MAKEWORD(2,0)BOOL bRecvOnly = FALSE; // Receive data only; don't echo back
void errexit(const char * format,...);
DWORD WINAPI ClientThread(LPVOID lpParam);int main( int argc , char *argv[])
{
char *service="echo";
struct sockaddr_in Serveraddr;
int Sock_listen,type,bindOK;
HANDLE hThread;
DWORD dwThreadId; WSADATA wsadata;
if(WSAStartup(WSVERS,&wsadata)!=0)
errexit("WSAStartup failed\n");
type=SOCK_STREAM;
Sock_listen=socket(PF_INET,type,0);
if (Sock_listen == INVALID_SOCKET)
errexit("can't create socket: %d\n", GetLastError()); memset(&Serveraddr,0,sizeof(Serveraddr));
Serveraddr.sin_family=AF_INET;
Serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
Serveraddr.sin_port=htons(DEFAULT_PORT);
bindOK=bind(Sock_listen,(struct sockaddr *)&Serveraddr,sizeof(Serveraddr));
if (bindOK != 0)
errexit("can't create binding: %d\n", GetLastError()); if(listen(Sock_listen,MaxCon)!=0)
errexit("can't create listening: %d\n", GetLastError()); struct sockaddr_in Clientaddr;
SOCKET client;
int clilen=sizeof(Clientaddr);
while(true)
{
char temp[BUFSIZE]; client=accept(Sock_listen,
(struct sockaddr*)&Clientaddr,&clilen);
printf("visited client: %s:%d\n",
inet_ntoa(Clientaddr.sin_addr), ntohs(Clientaddr.sin_port));
sprintf(temp,"Your IP is %s:%d\r\n",inet_ntoa(Clientaddr.sin_addr), ntohs(Clientaddr.sin_port));
send(client,temp,strlen(temp),0); strcpy(temp,"hello!this is the server!");
send(client,temp,strlen(temp),0);
hThread = CreateThread(NULL, 0, ClientThread,
(LPVOID)client, 0, &dwThreadId);
if (hThread == NULL)
{
printf("CreateThread() failed: %d\n", GetLastError());
break;
}
CloseHandle(hThread); closesocket(client);
} closesocket(Sock_listen);
WSACleanup();
return 0;
}
DWORD WINAPI ClientThread(LPVOID lpParam)
{
SOCKET s=(SOCKET)lpParam;
char Buf[BUFSIZE+1];
int ret,nLeft,px;
printf("Thread open,socket is %d",s);
while(true)
{
ret = recv(s, Buf, BUFSIZE, 0);
printf("here ret is%d",ret);
if (ret == 0)
break;
else if (ret == SOCKET_ERROR)
{
printf("recv() failed: %d\n", WSAGetLastError());
break;
}
Buf[ret] = '\0';
printf("RECV: '%s'\n", Buf); if (!bRecvOnly)
{
nLeft = ret;
px = 0; while(nLeft>0)
{
ret = send(s, &Buf[px], nLeft, 0);
if (ret == 0)
break;
else if (ret == SOCKET_ERROR)
{
printf("send() failed: %d\n",
WSAGetLastError());
break;
}
nLeft -= ret;
px += ret;
}
}
}
return 0;
}
void errexit(const char * format,...)
{
va_list args;
va_start(args,format);
vfprintf(stderr,format,args);
va_end(args);
WSACleanup();
exit(1);
}
解决方案 »
- c#学习 不知道是不是发错位置了
- 在同一界面中显示两组不同的字色和背景色,是如何做到的?
- UNIX到windows的转换ocket本机进程间通讯)
- 请问VC有P2P的文件共享系统开发包吗
- 一定要专家进来,Windows IOCP CPU利用率低的问题
- 一个类从Cwnd继承,主要是想执行settimer,请问,当这个类被构析时,先调用killtimer,那么这个构析函数会等待上一次仍在运行中的ontimer
- 如何实现两台没有IP地址直连机器之间的通讯???
- 不知道VC++编程中的动态文本框控件能不能变成平面状呢,有哪位大侠晓得的?
- 如何动态创建LISTCTRL,并动态接受LISTCTRL的消息
- 有LVS_OWNERDRAWFIXED样式的列表控件怎么往里面加Item,除了用CDC输出还有别的简便方法吗?
- DirectShow的数据传输问题
- SDI的单文档应用程序
closesocket(client);
}
改为
}
closesocket(client);
建立连接后,代码如下
char buf[BUFSIZE+1];
SOCKET s;
int ret; s=ConTCP(PServerIp,PServerPort); while(fgets(buf,sizeof(buf),stdin))
{
ret = recv(s, buf,BUFSIZE, 0);
if (ret == 0)
break;
else if (ret == SOCKET_ERROR)
{
printf("recv() failed: %d\n", WSAGetLastError());
break;
}
buf[ret] = '\0';
printf("RECV [%d bytes]: '%s'\n", ret, buf);
}
closesocket(s);
应该没有问题
麻烦大家帮忙看看
closesocket(client);
}
改为
}
closesocket(client);10038的错误已经没有了
但不知为何,在线程里还是不能接收到客户端发来的数据
继续求助...