比如说我下面的这个程序。
// 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;
}
// 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;
}
//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;
}