socket 編程

服務端:

#include "stdafx.h"
#include  <stdio.h>  
#include <WINSOCK2.H>

#pragma comment(lib, "ws2_32.lib")  
DWORD  WINAPI  AnswerThread(LPVOID  lparam)  
{  
	SOCKET  ClientSocket=(SOCKET)(LPVOID)lparam;  
	
	int  bytesRecv;  
	char  sendbuf[32]="";  
	char  recvbuf[32]="";  
	
	while(1)  
	{  
		bytesRecv=SOCKET_ERROR;  
		for(int  i=0;i<(int)strlen(recvbuf);i++)  
		{
			recvbuf[i]='\0';
		}		
		while(bytesRecv==SOCKET_ERROR)  
		{  //Receiving Data
			bytesRecv=recv(ClientSocket,recvbuf,32,0);  
		} 		
		//Write your processing code here
		send(ClientSocket,recvbuf,strlen(recvbuf),0);  
		printf("%s\n",recvbuf);  
	}  
	return  0;  
}  

int  main(int  argc,char*  argv[])  
{  
	//initialize  Winsock  
	WSADATA  wsaData;  
	int  iRet=WSAStartup(MAKEWORD(2,2),&wsaData);  
	if(iRet!=NO_ERROR)  
		printf("Error  at  WSAStartup()\n");  
	
	//create  a  socket  
	SOCKET  m_socket;  
	m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  
	if(m_socket==INVALID_SOCKET)  
	{  
		printf("Error  at  socket():%ld\n",WSAGetLastError());  
		WSACleanup();  
		return  0;  
	}  
	
// 	SOCKADDR_IN addrSrv;
// 	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
// 	addrSrv.sin_family = AF_INET;
// 	addrSrv.sin_port = htons(6000);
	//bind  a  socket  
	sockaddr_in  service;  
	service.sin_family=AF_INET;  
//	service.sin_addr.s_addr=inet_addr("192.168.45.136"); 
	service.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	service.sin_port=htons(1008);  
	
	if(bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)  
	{  
		printf("bind()  failed.\n");  
		closesocket(m_socket);  
		return  0;  
	}  
	else  
		printf("bind  OK.\n");  
	
	//listen  on  a  socket  
	if(listen(m_socket,20)==SOCKET_ERROR)  
		printf("Error  listening  on  socket.\n");  
	else  
		printf("listening  ok.\n");  
	
	//accept  a  connection  
	SOCKET  AcceptSocket;  
	
	printf("Waiting  for  a  client  to  connect...\n");  
	while(1)  
	{  
		AcceptSocket=SOCKET_ERROR;  
		while(AcceptSocket==SOCKET_ERROR)  
		{  
			AcceptSocket=accept(m_socket,NULL,NULL);  
		}  
		printf("Client  Connected.\n");  
		
		DWORD  dwThreadId;  
		HANDLE  hThread;  
		
		hThread=CreateThread(NULL,NULL,AnswerThread,(LPVOID)AcceptSocket,0,&dwThreadId);  
		if(hThread==NULL)  
		{  
			printf("CreatThread  AnswerThread()  failed.\n");  
		}  
		else  
		{  
			printf("CreateThread  OK.\n");  
		}  
	}  
	return  0;  
}


另一種方式:

服務端:

//程序需要連接ws2_32.lib文件 project--link---Object/libary modules添加ws2_32.lib
#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
	//加載套接字庫
	WORD wVersionRequested;//WinSock庫的版本號
	WSADATA wsaData;
	int err;
	
	wVersionRequested = MAKEWORD( 1, 1);
	err = WSAStartup(wVersionRequested, &wsaData);
	if( err != 0)
	{
		return 1 ;
	}
	
	if( LOBYTE( wsaData.wVersion) != 1 || HIBYTE( wsaData.wVersion) !=1 )
	{
		WSACleanup();
		return -2;
	}
	//創建用於監聽的套接字
	SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
	
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);
	
	//綁定套接字
	bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
	//將套接字設爲監聽模式,準備接受客戶請求
	listen(sockSrv, 5);//5爲等待連續隊列的最大值
	
 	SOCKADDR_IN addrClient;
 	int len = sizeof(SOCKADDR);

// 	int nNetTimeout=10*1000;//1秒,
// 	//設置發送超時
// 	setsockopt(sockSrv,SOL_SOCKET,SO_SNDTIMEO, (char *)&nNetTimeout,sizeof(int));
// 	//設置接收超時
// 	setsockopt(sockSrv,SOL_SOCKET,SO_RCVTIMEO, (char *)&nNetTimeout,sizeof(int));

	//等待客戶請求到來
	
	while(1)
	{
		SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);//sockConn建立連接的套接字
		char sendBuf[100] = {0};
		sprintf( sendBuf, "Welcome %s Client \n", inet_ntoa(addrClient.sin_addr));	
		//發送數據
		send( sockConn, sendBuf, strlen(sendBuf)+1, 0 );
		char recvBuf[100] = {0};
		//接受數據
		recv( sockConn, recvBuf, 100, 0 );
		//打印接受的數據
		printf( "%s\n", recvBuf);
		//關閉套接字
		closesocket(sockConn);	
	}	
	
	return 0;
}


 

客戶端:

#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
	
	//加載套接字庫
	WORD wVersionRequested;//WinSock庫的版本號
	WSADATA wsaData;
	int err;
	
	wVersionRequested = MAKEWORD( 1, 1);
	err = WSAStartup(wVersionRequested, &wsaData);
	if( err != 0)
	{
		return -1 ;
	}
	
	if( LOBYTE( wsaData.wVersion) != 1 || HIBYTE( wsaData.wVersion) !=1 )
	{
		WSACleanup();
		return -2;
	}
	//創建套接字
	SOCKET sockClient = socket( AF_INET,SOCK_STREAM, 0 );
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);

	//向服務器發出連接請求
	connect( sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

	//接受數據
	char recvBuf[100];
	recv( sockClient, recvBuf, 100, 0 );
	printf( "%s\n", recvBuf );

	//發送數據
	send(sockClient, "This is Dong Liu", strlen( "This is Dong Liu" )+1, 0 );
	
	//關閉套接字
	closesocket(sockClient);
	WSACleanup();
	return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章