socket 套接字的使用


socket 服務器端和客戶端通信,面向TCP的

服務器端步驟:

1、創建用於監聽的套接字(socket)

2、將套接字綁定到本地地址和端口上(bind)

3、將套接字設為監聽模式(listen)

4、等待客戶請求(accept),此處要不斷的調用accept

5、通信(send/receive),完成后返回4

6、關閉套接字(closesocket)

 

客戶端步驟:

1、創建套接字

2、向服務器發送連接請求(connect)

3、通信(send/recv)

4、關閉套接字

 

程序代碼:

服務器端:

#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib,"Ws2_32.lib.")

void main()
{

	/* 加載套接字庫 */
	WORD wVersionRequested;
	// 所使用套接字的版本號
	WSADATA wsaData;
	// 存儲套接字版本的有關信息
	int err;

	wVersionRequested = MAKEWORD(1,1);
	// 請求版本號,高位和低位字節均為1

	err = WSAStartup(wVersionRequested,&wsaData);
	// 加載套接字
	if(err != 0)
	{
		return;
	}

	if (LOBYTE(wsaData.wVersion)!=1 ||
		HIBYTE(wsaData.wVersion)!=1)
	{
		WSACleanup();
		//如果高位或低位字節不為1終止對套接字的使用
		return;
	}

	/* 創建用於監聽的套接字 */
	SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
	// 創建套接字,流式套接字,第三個參數設為0則自動選擇合適的協議

	/* 綁定套接字 */
	SOCKADDR_IN addrSrv;
	// 服務器地址信息,使用SOCKADDR_IN 代替SOCKETADD, 結構體的大小相等,可強制轉換
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(600);
	// 使用htons函數轉換為網絡字節序
	
	bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));
	// 將監聽套接字綁定到本地地址和端口上
	listen(sockSrv,5);
	// 監聽

	/* 等待客戶到來並接收發送數據 */
	SOCKADDR_IN addrClient;
	// 接收客戶地址信息緩沖區
	int len=sizeof(SOCKADDR);

	while(1){
		SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
		// 等待接收客戶連接請求,並返回連接套接字,利用這個套接字實現通信
		char sendBuf[100];
		sprintf(sendBuf,"Welcome %s to www.cnblogs.com/xiao-cheng",
			inet_ntoa(addrClient.sin_addr));
		send(sockConn,sendBuf,strlen(sendBuf)+1,0);
		// 發送數據,多加一個長度是字符串結束符
		char recvBuf[100];
		recv(sockConn,recvBuf,100,0);
		// 接收數據
		printf("%s\n",recvBuf);
		closesocket(sockConn);
	}
}
客戶端:
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib,"Ws2_32.lib.")

void main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested=MAKEWORD(1,1);

	err=WSAStartup(wVersionRequested,&wsaData);
	if (err!=0)
	{
		return;
	}

	if(LOBYTE(wsaData.wVersion)!=1
		|| HIBYTE(wsaData.wVersion)!=1){
			WSACleanup();
			return;
	}
	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(600);

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

	char recvBuf[100];
	recv(sockClient,recvBuf,100,0);
	printf("%s\n",recvBuf);

	send(sockClient,"Request",strlen("Request")+1,0);

	closesocket(sockClient);
	WSACleanup();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM