vs2010編寫的簡單socket聊天

菠蘿味菠蘿啤發表於2020-10-09

伺服器端

// server.cpp : 定義控制檯應用程式的入口點。
//mfc用來了解win的作業系統的核心

#include "stdafx.h"
#include<WinSock2.h>//引入標頭檔案
#pragma comment(lib,"ws2_32.lib") //載入動態庫


int _tmain(int argc, _TCHAR* argv[])
{
	
//1,請求協議版本
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);//請求2.2版本的通訊協議
if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){//判斷請求版本是否成功
	printf("請求版本失敗\n");
	return -1;
}
printf("請求版本成功!\n");


//2,建立套接字,手機把聲音變成電訊號,socket也是一個作用
SOCKET serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(serverSocket == INVALID_SOCKET){
printf("建立socket失敗\n");
return -1;
}

printf("建立socket成功!\n");

//3,建立協議地址族
SOCKADDR_IN addr={0};
addr.sin_family = AF_INET;	//1,協議
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//2,主機
addr.sin_port = htons(10087);	//3,網路埠  應用

	
//4,繫結
int r=bind(serverSocket,(sockaddr*)&addr,sizeof addr);
if(r==-1){
	printf("bind失敗!\n");
	return -1;
}
printf("bind成功!\n");

//5,監聽(為了安全,通話可能會被錄音)
//tcp是安全的,所以要監聽,指定最大監聽數量,同樣也判斷一下,是否在這一步是否會失敗 ,
//	怎麼監聽,監聽這個埠就可以了,同時給他一個數字,指定最大監聽數量 
r=listen(serverSocket,10);
if(r==-1){
	printf("listen失敗!\n");
return -1;
}
printf("listen成功!");
//6,等待客戶端連線
SOCKADDR_IN cAddr = { 0 };
int len =  sizeof cAddr;
	SOCKET clientSocket  = accept(serverSocket,(sockaddr*)&cAddr,&len);
//如果這個埠是個錯誤的埠, SOCKET_ERROR也就是-1,-1代表常規的錯誤
if(clientSocket == SOCKET_ERROR)
{
	printf("錯誤的客戶端!\n");
	closesocket(serverSocket);
	WSACleanup();
	return -1;
}
printf("有客戶端連線進來了:%s\n",inet_ntoa(cAddr.sin_addr));
//從caddr裡面拿IP地址,從整數轉成字串,要不然是看不懂的
//通訊
char buff[255];

while(1){//每一次接收前,把內容清空
	memset(buff,0,256);
	r = recv(clientSocket,buff,255,NULL);
	if(r>0){
	printf(">>%s\n",buff);
	}
}




while(1);
return 0;
}

客戶端

// client.cpp : 定義控制檯應用程式的入口點。

#include "stdafx.h"
#include<WinSock2.h>//引入標頭檔案
#pragma comment(lib,"ws2_32.lib") //載入動態庫


int _tmain(int argc, _TCHAR* argv[])
{
	
//1,請求協議版本
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);//請求2.2版本的通訊協議
if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){//判斷請求版本是否成功
	printf("請求版本失敗\n");
	return -1;
}
printf("請求版本成功!\n");


//2,建立套接字,手機把聲音變成電訊號,socket也是一個作用
SOCKET serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(serverSocket == INVALID_SOCKET){
printf("建立socket失敗\n");
return -1;
}

printf("建立socket成功!\n");

//3,獲取協議地址族
SOCKADDR_IN addr={0};
addr.sin_family = AF_INET;	//1,協議
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//2,主機
addr.sin_port = htons(10087);	//3,網路埠  應用


//4,連線伺服器

int r = connect(serverSocket,(sockaddr*)&addr,sizeof addr);
if(r==-1)
{
	printf("伺服器不理我\n");
	return -1;
}
printf("連線伺服器成功");

//通訊
char buff[255];
while(1){
	memset(buff,0,256);
	printf("你要發什麼\n");
	scanf("%s",buff);
	r = send(serverSocket,buff,strlen(buff),NULL);
	if(r>0){
		printf("傳送%d位元組到伺服器成功\n",r);
	}

}



while(1);
return 0;
}







相關文章