使用套接字send 的时候发送结构strict xx{
short head;
}send(server,(char*)xx,sizeof(xx),0);接的时候怎么接.服务器端提示收到信息了,.但是读取的时候会提示读取冲突.应该怎么读.可以给个 详细的例子 吗?========================================================问题二:为什么 我的服务器端只能接收一个客户端连接?windows socket 编程
short head;
}send(server,(char*)xx,sizeof(xx),0);接的时候怎么接.服务器端提示收到信息了,.但是读取的时候会提示读取冲突.应该怎么读.可以给个 详细的例子 吗?========================================================问题二:为什么 我的服务器端只能接收一个客户端连接?windows socket 编程
解决方案 »
- 怎么用VC++才能把自己画的直线啊,椭圆啊用bmp格式的文件给保存起来,我在做类似windows自带的画图软件
- 两个问题,答出加分
- 怎样解决头文件相互包括的问题?
- 请教高手:程序从debug版改为release版出现这样的问题,为什么?
- 二个很简单的问题问一下,马上就给分
- 紧急求助!控件开发的问题
- 如何得到窗体被覆盖或是移出屏幕的消息?
- 高分求就--如何才能控制realplayer??
- 指针
- 825分有人想要吗?谁能告诉我Indeo 5.04 的解压程序是什么(都包含哪些文件),如何打包?
- 問個config文件的問題
- 二进制“=”: 没有找到接受“std::_Tree<_Traits>::const_iterator”类型的右操作数的运算符(或没有可接受的转换)
typedef struct _tagMyStruct{
short head;
}MyStruct, *LPMyStruct;
#pragma pack发送(Client端):MyStruct A;
A.head = 100;
char *P = (char *)&A;
int len = sizeof(A);
while (len){
int ret = send(Server, P, len, 0);
if(SOCKET_ERROR == ret){
count<<"send过程发生错误:"<<WSAGetLastError()<<endl;
break;
}
if(!ret){
count<<"send过程发生中连接已断开!"<<endl;
break;
}
len -= ret;
P += ret;
if(!len){
count<<"数据发送完毕."<<endl;
}
}
监听(Server端):WSAData wsaData;
if(WSAStartup(MAKEWORD(1,1), &wsaData)){
count<<"WSAStartup 失败,错误号:"<<WSAGetLastError()<<endl;
return;
}SOCKET sock = socket(PF_INET,
SOCK_STREAM,
0);
if(INVALID_SOCKET == sock){
count<<"调用socket失败:"<<WSAGetLastError()<<endl;
WSACleanup();
return;
}
const int port = 1234;
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(port);//监听端口
if(bind(sock, (struct sockaddr*)&local, sizeof(local)) == SOCKET_ERROR){
count<<"调用bind到端口"<<port<<"失败,错误号:"<<WSAGetLastError()<<endl;
closesocket(sock);
WSACleanup();
return;
}if(listen(sock, SOMAXCONN)==SOCKET_ERROR){
count<<"调用listen失败,错误号:"<<WSAGetLastError()<<endl;
closesocket(sock);
WSACleanup();
return;
}while(1){
struct sockaddr_in remote_addr;
memset(&remote_addr, 0, sizeof(sockaddr));
int addr_len = sizeof(sockaddr);
SOCKET sock_client = accept(sock, (struct sockaddr FAR*)&remote_addr, &addr_len);
if(sock_client == INVALID_SOCKET){
wsa_err = WSAGetLastError();
switch(wsa_err){
WSANOTINITIALISED: //
return;
WSAECONNRESET:
WSAEFAULT:
WSAEINPROGRESS:
WSAEMFILE:
WSAENOBUFS:
WSAEWOULDBLOCK:
continue;
WSAEINTR:
WSAEOPNOTSUPP:
WSAENETDOWN:// The network subsystem has failed.
WSAEINVAL://The listen function was not invoked prior to accept.
closesocket(sock);
WSAENOTSOCK:
WSACleanup();
return;
}
}
count<<"有一个客户端连接过来:"<<sock_client<<endl;
unsigned ThreadID;
HANDLE pThread=(HANDLE)_beginthreadex(NULL,
0,
WorkerThread,
&sock_client,
CREATE_SUSPENDED,
&ThreadID);
if(!pThread){
closesocket(sock_client);
count<<"创建工作线程失败:"<<WSAGetLastError()<<endl;
continue;
}
count<<"客户连接:"<<sock_client<<"交由线程:"<<ThreadID<<"处理!"<<endl;
ResumeThread(pThread);//这里也要判断返回值
CloseHandle(pThread);
}
closesocket(sock);
WSACleanup();
接收(Server端,采用多线程,用于处理多连接,如果要发送,与前面的Client端相似):unsigned WINAPI WorkerThread(LPVOID lpParam){
SOCKET sock_client = (SOCKET) (*lpParam);
WSAData wsaData;
if(WSAStartup(MAKEWORD(1,1), wsaData)){
closesocket(sock_client);
_endthreadex(1);
return 1;
} MyStruct A;
char *P = (char *) &A;
int len = sizeof(A);
while(len){
int ret = recv(sock_client, P, len, 0);
if(SOCKET_ERROR == ret){
count<<"Thread:"<<GetCurrentThreadId()<<" recv过程发生错误:"<<WSAGetLastError()<<endl;
break;
}
if(!ret){
count<<"Thread:"<<GetCurrentThreadId()<<" recv过程发生中连接已断开!"<<endl;
break;
}
len -= ret;
P += ret;
if(len == 0)
cout<<"Thread:"<<GetCurrentThreadId()<<" received from:"<<sock_client<<": A.head="<<A.head<<endl;
}
closesocket(sock_client);
WSACleanup();
_endthreadex(0);
}
2、再执行accept。