基於c++控制檯的Socket通信源碼

客戶端socket去連服務器和一個特定端口,連接成功後即可進行通信,發送字符串。服務器socket綁定一個端口,然後等待客戶機的接入,接收到客戶端發送的數據後打印。

客戶端代碼:

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

#include "stdafx.h"
#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
cout<
//初始化winsock
WSADATA wsaD;
WSAStartup(MAKEWORD(1, 1), &wsaD);

//創建客戶端socket
SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

//連接服務器
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //指定服務器
servaddr.sin_port = htons(8080); //指定端口
cout<
char flag[4];
gets_s(flag);
if(strcmp(flag, "yes") == 0)
{
connect(sclient, (struct sockaddr*)&servaddr, sizeof(servaddr)); //通過套接字連接主機
}

//發送數據
char buf[500];
cout< while(cin.getline(buf, 500))
{
//通過套接字給主機發送字符串
send(sclient, buf, strlen(buf) + 1, 0); //字符串還有個結束標誌,
}


return 0;
}
/<winsock2.h>/<string>/<iostream>

服務器代碼:

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

#include "stdafx.h"

#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using std::cout;
using std::cin;
using std::string;
using std::endl;


int _tmain(int argc, _TCHAR* argv[])
{
cout<
//初始化winsock
WSADATA wsaD;
WSAStartup(MAKEWORD(1, 1), &wsaD);

//創建監聽套接字
SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

// 綁定主機地址和監聽套接字
struct sockaddr_in my_addr; //主機地址
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(8080); //指定端口
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(slisten, (struct sockaddr *)&my_addr, sizeof(my_addr));

//啟動監聽
listen(slisten,5);

//開始接收數據
//struct sockaddr_in c_addr; //客戶地址

//int addr_len = sizeof(c_addr);
SOCKET sconnect = accept(slisten, NULL, NULL);//(struct sockaddr*)&c_addr, &addr_len); //通過監聽套接字創建連接套接字
cout<
while(true)
{
char buf[500]; //存儲接收的字符
int len = recv(sconnect, buf, sizeof(buf), 0); //通過連接套接字接收數據
if(len > 0)
{
cout< }
}

return 0;
}
/<winsock2.h>/<string>/<iostream>

備註

  • 在創建socket之前要調用WSAStartup(MAKEWORD(1,1),&wsad)

這個函數說明使用的版本是1.1版的,wsad存儲系統返回的winsocket信息。

  • 創建socket 調用socket(int af,int type,int protocol)

af不清楚,type有SOCK_STREAM(tcp),SOCK_DGRAM(udp) protocol :通信協議(默認為0)

  • 綁定端口,調用函數bind(SOCKET S,stuct sockaddr *name,int namelen)

S為監聽socket,name為主機地址(裡面指定了端口) ,namelen為地址變量長度。

  • 接下來使服務器處於監聽狀態,調用函數listen(SOCKET s,int backlog)

s為監聽socket, backlog為最大連接數,最大為5.

  • 客戶機連進來後就可通信了,但還要創建一個連接socket.調用accept(SOCKET S,struct sockaddr *addr int *addrlen)

s為監聽socket,addr用來存放客戶地址,addrlen為長度,然後返回連接socket.

  • 然後就可以利用連接socket接收數據了,調用recv(SOCKET s,char *buf,int len,int flags)

s為連接socket,buf來存放接收數據,為字符數組首地址。len為buf的最大長度,不是buf的實際長度,flags為此函數調用的方式。


分享到:


相關文章: