前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux下socket双向通信

Linux下socket双向通信

作者头像
李海彬
发布2018-03-22 12:00:03
2.3K0
发布2018-03-22 12:00:03
举报
文章被收录于专栏:Golang语言社区Golang语言社区

linux下的socket与windows下的类似,就是少一个初始化的过程。

服务端 客户端

1 创建socket 1 创建socket

2 绑定 2 连接

3 监听

4 接受

发送与接受消息,客户端与服务端都是用的recv与send,在使用完成后记得close,以释放端口资源。

下面是服务端

[cpp] view plain copy

代码语言:javascript
复制
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <iostream> 
using namespace std;  
#include <pthread.h> 
 
void* receiveMsg(void *sock)  
{  
 char buffer[4096];  
 int* socket = (int*)sock;  
 while (1) {  
        memset(buffer,0,sizeof(buffer));  
        ssize_t byteCount = recv(*socket, buffer, 4096, 0);  
 if(byteCount <= 0)  
        {  
 continue;  
        }  
        cout << "recv:" <<buffer << endl;  
    }  
}  
 
void* sendMsg(void* sock)  
{  
 while (1) {  
        usleep(500);  
 char buffer[4096];  
        memset(buffer, 0, sizeof(buffer));  
        cin >> buffer;  
 if(strlen(buffer) < 0)  
        {  
 continue;  
        }  
        ssize_t byteCount = send(*(int*)sock, buffer, 4096, 0);  
 if(byteCount < 0)  
        {  
            cout << "send failed" << endl;  
        }  
    }  
}  
 
int main()  
{  
    pthread_t sendPthread;  
    pthread_t recvPthread;  
 
    in_port_t servPort = 7777;  
 int servSock;  
 if ((servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)//创建socket 
    {  
        cout << "socket error" << endl;  
    }  
 
 struct sockaddr_in servAddr;  
    memset(&servAddr, '\0', sizeof(struct sockaddr_in));  
    servAddr.sin_family = AF_INET;  
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);//让系统自动填充地址,不用自己去查明本机的地址是多少 
    servAddr.sin_port = htons(servPort);  
 
 if(bind(servSock, (struct sockaddr*)&servAddr, sizeof(servAddr)) < 0) //把套接字绑定到指定的地址与端口 
    {  
        cout << "bind error" << endl;  
    }  
 
 if(listen(servSock, 5)< 0)//开始监听,等待客户端的连接,listen调用之前,客户端无法连接到服务端,第二个参数为最大连接数 
    {  
        cout << "listen filed" << endl;  
    }  
 
 struct sockaddr_in clntAddr;  
    socklen_t clntAddrLen = sizeof(clntAddr);  
 int clntSock = accept(servSock, (struct sockaddr*)&clntAddr, &clntAddrLen);  
 
 if (clntSock < 0)  
    {  
        cout << "accept error" << endl;  
    }  
 
 char clntName[1024];  
 if (inet_ntop(AF_INET, &clntAddr.sin_addr.s_addr, clntName, sizeof(clntName)) != NULL) {  
        cout << "Handling client: " << clntName << " port: " << ntohs(clntAddr.sin_port) << endl;;  
    } else {  
        cout << "client address get failed " << endl;  
    }  
 
    pthread_create(&sendPthread, NULL, sendMsg, &clntSock);  
    pthread_create(&recvPthread, NULL, receiveMsg, &clntSock);  
    pthread_join(sendPthread, 0);  
    pthread_join(recvPthread, 0);  
}  

下面是客户端

[cpp] view plain copy

代码语言:javascript
复制
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <iostream> 
using namespace std;  
 
void* sendMsg(void * socket)  
{  
 int sock = *((int*)socket);  
 while (1) {  
 char msg[4096];  
        memset(msg, 0, sizeof(msg));  
        cin >> msg;  
 size_t outputlength = strlen(msg);  
 if (0 == outputlength)  
        {  
 continue;  
        }  
 
        ssize_t bytecount = send(sock, msg, outputlength, 0);//发送消息 
 if (bytecount < 0) {  
            cout << "send failed" << endl;  
        }  
    }  
}  
 
void* recvMsg(void * socket)  
{  
 int sock = *((int*)socket);  
 while (1) {  
 char msg[4096];  
        memset(msg, 0, sizeof(msg));  
 
        ssize_t bytecount = recv(sock, msg, sizeof(msg), 0); //接收消息 
 if (bytecount <= 0) {  
 continue;  
        } else {  
            cout << "recv:" << msg << endl;  
        }  
 
    }  
}  
 
int main()  
{  
    pthread_t recv;  
    pthread_t send;  
 char ipaddr[14] = "127.0.0.1";  
 int port = 7777;  
 int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//AF_INET指明使用ipv4,sock_stream指定使用流套接字,ipproto_tcp指定使用tcp协议 
 
 if (sock < 0) {  
        cout << "socket() failed" << endl;  
    }  
 
 struct sockaddr_in servAddr;//结构体用于存放地址 
    memset(&servAddr, '\0', sizeof(struct sockaddr_in));  
    servAddr.sin_family = AF_INET;  
 
 int rtn = inet_pton(AF_INET, ipaddr, &servAddr.sin_addr.s_addr);//转换ip地址格式,从本机字节序转换成为网络字节序 
 if (rtn == 0) {  
        cout << "address wrong ,inet_pton() failed" << endl;  
    } else if (rtn < 0) {  
        cout << "inet_pton() failed" << endl;  
    }  
 
    servAddr.sin_port = htons(port);  
 
 if(connect(sock, (struct sockaddr*)&servAddr, sizeof(servAddr)) < 0)//连接到服务器 
    {  
        cout << "connect failed" << endl;  
    }  
 
    pthread_create(&recv, NULL, recvMsg, &sock);  
    pthread_create(&send, NULL, sendMsg, &sock);  
    pthread_join(recv, 0);  
    pthread_join(recv, 0);  
 
    close(sock);  
}  

注意:网络接收到的数据可能是不安全的,在使用printf等函数时要注意安全。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档