window下的客户端
参考文档 安装MinGW:
https://blog.csdn.net/weixin_43141320/article/details/114487461
CMakeLists.txt
添加,要在add_executable前面
link_libraries(ws2_32 wsock32)
tcp socket 客户端如下:
#include <iostream>
#include <string>
#include <cstring>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main() {
cout << "测试开始了!" << endl;
SOCKET clientsocket;
SOCKADDR_IN serveraddr;
SOCKADDR_IN clientaddr;
char buf[1024];
WSADATA wsa;
WSAStartup(MAKEWORD(2,0),&wsa); //初始化WS2_32.DLL
//创建套接字
if((clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0)
{
printf("套接字socket创建失败!\n");
return -1;
}
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(8888); //
serveraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//请求连接
printf("尝试连接中...\n");
if(connect(clientsocket, (SOCKADDR *)&serveraddr, sizeof(serveraddr)) != 0)
{
printf("连接失败!\n");
return -1;
}
printf("连接成功!\n");
//发送数据
printf("请输入发送给服务器的字符:\n");
scanf("%s", buf);
if(send(clientsocket, buf, sizeof(buf), 0)<=0)
// if(send(clientsocket, buf, strlen(buf)+1, 0)<=0)
{
printf("发送错误!\n");
}
//接收数据 这里是同步处理发送后的接收,如果需要大数据量,可以接收改成异步
while(1){
if(recv(clientsocket, buf, 1024, 0) <= 0)
{
printf("关闭连接!\n");
//closesocket(clientsocket);
break;
}
printf("接收来自服务器的信息: %s\n",buf);
//break;
}
//关闭套接字
closesocket(clientsocket);
WSACleanup(); //释放WS2_32.DLL
return 0;
}
Linux 下的服务端 tcp socket如下:
#include <functional>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include <cstring>
//创建接受数据的socket
int iConn = 0;
int ist = socket(AF_INET,SOCK_STREAM,0);
printf("socket ss:%d \n",ist);
struct sockaddr_in server_sockaddr;
//配置sockaddr_in 结构体中相关参数
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(CARSOCKETPORT);
printf("INADDR_ANY:%d \n",INADDR_ANY);
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
int on = 1;
if(setsockopt(ist, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int)) < 0){
perror("setsockopt error");;
exit(1);
}
if(-1 == bind(ist,(struct sockaddr*)&server_sockaddr,sizeof(server_sockaddr)) ){
perror("bind error");;
exit(1);
}
if(-1 == listen(ist,100)){
perror("bind listen");
exit(-1);
}
while (1){
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
//成功返回非负描述字,出错返回-1
iConn = accept(ist,(struct sockaddr*)&client_addr,&length);
if(iConn < 0){
perror("connect error");
exit(1);
}else{
cout<<"one connect in"<<endl;
}
char addr[16];
memset(addr, 0, sizeof(addr));
strcpy(addr, inet_ntoa(client_addr.sin_addr));
cout << "client ip:" << addr << ";port:" << client_addr.sin_port << endl;
char buffer[1024];
memset(buffer,0,sizeof(buffer));
//这里是同步处理发送后的接收,如果需要大数据量,可以改成异步
int len = recv(iConn, buffer, sizeof(buffer), 0);
if(len <= 0){
cout<<"recv failed."<<endl;
close(iConn); //accept函数连接成功后还会生成一个新的套接字描述符,这里需要关闭
//break;
}else{
// printf("recv buffer %s",buffer);
cout<<"recv buffer:"<<buffer<<endl;
struct Data temp;
memset(&temp,0,sizeof(temp));
memcpy(&temp,buffer,sizeof(temp));
}
//给客户端返回信息 本流程可以不用返回信息
// send(iConn, buffer, len ,0);
}
close(iConn); //accept函数连接成功后还会生成一个新的套接字描述符,这里需要关闭
close(ist); // 关闭套接子描述副
linux客户端 tcp socket如下:,如下:
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <thread>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include <cstring>
// 创建一个socket
int s = socket(AF_INET, SOCK_STREAM, 0);
// 如果返回值为-1,则创建失败
if (s == -1)
{
cout << "create socket err" << endl;
return;
}
sockaddr_in server_addr;
server_addr.sin_port = htons(8080);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
// 连接对应地址的socket
if (connect(s, (sockaddr *)&server_addr, sizeof(server_addr)) == -1)
{
perror("connection");
return ;
}
char buf[1024];
memset(buf, 0, sizeof(buf));
// 发送数据
if (send(s, buf, sizeof(buf), 0) == -1)
{
perror("send data err");
return ;
}
cout << "send msg " << buf << " successfully" << endl;
// 关闭socket
close(s);