比如说我下面的这个程序。
// Socket_accept_thread.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include "windows.h"
#include "comlib.h"
DWORD WINAPI Thread1Proc( LPVOID lpParameter); //线程的执行函数
DWORD WINAPI NMS_accept_run(SOCKET s,caddr_t addr, int *addrlen);
extern "C" {
SOCKET NMS_accept(SOCKET s,caddr_t addr, int *addrlen);
};
void _tmain(int argc, _TCHAR* argv[])
{
// Initialize Winsock.
HANDLE hThread1=CreateThread(NULL,0,Thread1Proc,NULL,0,NULL); //『注意2』创建线程1
CloseHandle(hThread1); //关闭标识线程1的句柄
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR) {
printf("Error at WSAStartup()\n");
return;
}SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sockSrv == INVALID_SOCKET)
{
printf("Error as socket(): %ld\n",WSAGetLastError());
WSACleanup();
return;
}// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015);if(bind(sockSrv,(SOCKADDR*)&service,sizeof(service)) == SOCKET_ERROR)
{
printf("bind() failed.\n");
closesocket(sockSrv);
WSACleanup();
return;
}//Listen for incoming connection requests.
//on the created socket
if(listen( sockSrv, 1 ) == SOCKET_ERROR)
{
printf("Error listening on socket.\n");
WSACleanup();
return;
}//Create a SOCKET for accepting incoming requests.
SOCKET AcceptSocket;printf("Waiting for client on connect...\n");
 
AcceptSocket = NMS_accept( sockSrv, NULL, NULL );
//SOCKET recFileSKT = accept(sockSrv,(sockaddr*)&addrclient,&addrsize);  
Sleep(100);
if (AcceptSocket != INVALID_SOCKET)
{
printf("accept sucess.\n");
}
getchar();return ;
}
DWORD WINAPI NMS_accept_run(SOCKET s,caddr_t addr, int *addrlen){
NMS_accept(s,addr,addrlen);
return 0;
}
DWORD WINAPI Thread1Proc( LPVOID lpParameter)
{
WORD wVersionRequested;   
WSADATA wsaData;   
int err;   wVersionRequested=MAKEWORD(1,1);   err=WSAStartup(wVersionRequested,&wsaData);   
if (err!=0)   
{   
return 0 ;   
}   if (LOBYTE(wsaData.wVersion)!=1||   
HIBYTE(wsaData.wVersion)!=1)   
{   
WSACleanup();   
return 0;   
}   //create socket   
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);   SOCKADDR_IN addrSrv;   
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//translate U_LONG to TCP/IP sequence.   
addrSrv.sin_family=AF_INET;   
addrSrv.sin_port=htons(27015);   //send request to server   
int temp = connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));   
if(temp == 0)
printf ("connect sucessful.\n");
else if(temp == SOCKET_ERROR)
printf ("connect error.\n");getchar();
closesocket(sockClient);   
WSACleanup();
return 0;
}

解决方案 »

  1.   

    不知道你想怎样 。。初始化不用重复的做 做一次就好了。。封装成1个函数在main的开头调用一下就ok了 。。创建线程以后你可以做个循环去等待你的连接
      

  2.   


    //accept 线程
    DWORD WINAPI accept_thread(LPVOID lparam){
        SOCKET sListen = (SOCKET)lparam;
        sockaddr_in * si;
        int len = sizeof(si);    while (1){
            SOCKET sCon = accept (sListen, (sockaddr*)&si, &len);
            if (sCon != INVALID_SOCKET){
                    //WorkThread 就是针对一个连接的线程。
                    CreateThread (NULL, 0, WorkThread, NULL, 0, NULL);
            }
        }
        return 0;
    }
      

  3.   

    上面的代码:WorkThread 的参数应该设置为 新连接的SOCKET