本文主要是介绍linux网络通信之tcp,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
客户端
/*************************************************************************> File Name: client.c> Author: 联合作战实验室> Mail: v.manstein@qq.com> Created Time: Wed 22 Mar 2017 02:47:10 PM CST************************************************************************/#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>#define err_log(errlog) do{printf("%s: %s, %d", __FILE__, __func__, __LINE__);\perror(errlog);}while(0)
#define N 128int main(int argc, const char* argv[])
{int sockfd, acceptfd;// clinet sockfdchar buf[N] = {};// 网络通信结构体对象struct sockaddr_in serveraddr;int addrlen = sizeof(struct sockaddr_in);if(argc < 3) {printf("usage: %s ipaddr port\n", argv[0]);exit(-1);} // 创建套接字if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {err_log("socket error");exit(-1);}// 初始化网络通信结构体对象serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(argv[1]);serveraddr.sin_port = htons(atoi(argv[2]));// 客户端发起对服务器的链接通信访问请求 if(connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr)) < 0) {err_log("connect error");}printf("client connect success\n");while(1) {printf("input:");fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = '\0';// 发送消息if(send(sockfd, buf, N, 0) < 0) {err_log("send error");}if(strncmp(buf, "quit", 4) == 0 ) {break;}
// 接受消息if(recv(sockfd, buf, N, 0) < 0) {err_log("recv error");}printf("%s\n", buf);}close(sockfd);return 0;}
![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
/*************************************************************************> File Name: server.c> Author: 联合作战实验室> Mail: v.manstein@qq.com> Created Time: Wed 22 Mar 2017 02:47:10 PM CST************************************************************************/#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>#define err_log(errlog) do{printf("%s: %s, %d", __FILE__, __func__, __LINE__);\perror(errlog);}while(0)
#define N 128
int main(int argc, const char* argv[])
{int sendbuf = 0; int recvbuf = 0;int len;int sockfd, acceptfd;// clinet sockfd// 网络通信结构体// struct sockaddr_in { // __SOCKADDR_COMMON (sin_); // 地址族// in_port_t sin_port; /* Port number. 端口号 */// struct in_addr sin_addr; /* Internet address. ip地址 */// /* Pad to size of `struct sockaddr'. */// unsigned char sin_zero[sizeof (struct sockaddr) - // __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) -// sizeof (struct in_addr)]; // 占位填充,没有实际意义// }; struct sockaddr_in serveraddr, clinetaddr;int addrlen = sizeof(struct sockaddr_in);char buf[N] = {};if(argc < 3) {printf("usage: %s ipaddr port\n", argv[0]);exit(-1);} if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {err_log("socket error");exit(-1);}serveraddr.sin_family = AF_INET;// inet_addr将点分十进制的ip地址,转换成本地地址进行存储(网络字节序的)serveraddr.sin_addr.s_addr = inet_addr(argv[1]);// htons将本机字节序转换为网络字节序serveraddr.sin_port = htons(atoi(argv[2]));// 将网络信息结构体和网络套接字绑定if(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr_in)) < 0) {err_log("bind error");}// 设置监听队列,将网络套接字置于被动监听模式if(listen(sockfd, 5) < 0) {err_log("listen error");}// 接收客户端请求,反回一个与此客户端通信的套接字if((acceptfd = accept(sockfd, (struct sockaddr*)&clinetaddr, &addrlen)) < 0) {err_log("accept error");}printf("acceptfd: %d, %s, %d", acceptfd, inet_ntoa(clinetaddr.sin_addr), ntohs(clinetaddr.sin_port));while(1) {if(recv(acceptfd, buf, N, 0) < 0) {err_log("recv error");}if(getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &recvbuf, &len) == -1) { // 获取接收缓冲区大小err_log("getsockopt error: ");}printf("recvbuf length: %d\n", recvbuf);if(getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sendbuf, &len) == -1) { // 获取发送缓冲区大小err_log("getsockopt error: ");}printf("sendbuf length: %d\n", sendbuf);printf("\naccept from clinet: %s\n", buf);if(strncmp(buf, "quit", 4) == 0 ) {break;}strcat(buf, "form server,");if(send(acceptfd, buf, N, 0) < 0) {err_log("send error");}}close(sockfd);close(acceptfd);return 0;}
这篇关于linux网络通信之tcp的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!