Linux socket 学习
来源:互联网 发布:事业单位选调考试软件 编辑:程序博客网 时间:2024/06/06 20:26
- Linux socket 学习
- TCP server
- TCP client
- 参考资料
Linux socket 学习
TCP server
服务端建立步骤一般为:socket->bind->listen->accept
#include <stdio.h> /* stdin, stdout, stderr */#include <string.h> /* memset, strerror */#include <sys/types.h> /* socket, bind, listen, send */#include <sys/socket.h> /* socket, bind, listen, send */#include <netinet/in.h> /* sin_family, sin_port, sin_addr (man in.h) */#include <arpa/inet.h> /* inet_pton, htons (man inet.h) */#include <errno.h> /* errno */#define BUFSIZE 1024#define IP "127.0.0.1"#define PORT 8888#define LISTENQ 5/* * gcc tcp_server.c -o server * $ ./server * */int main(int argc, char *argv[]){ int srv_sockfd; int cli_sockfd; size_t len; size_t sin_size; struct sockaddr_in srv_addr; struct sockaddr_in cli_addr; char buf[BUFSIZE]; memset(&srv_addr, 0, sizeof(srv_addr)); srv_addr.sin_family = AF_INET; inet_pton(AF_INET, IP, &srv_addr.sin_addr); srv_addr.sin_port = htons(PORT); /* TCP: socket套接字 */ if ((srv_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { fprintf(stderr, "create socket fail, %s.\n", strerror(errno)); return 1; } /* bind地址 */ if (bind(srv_sockfd, (struct sockaddr*)&srv_addr, sizeof(struct sockaddr)) < 0) { fprintf(stderr, "create bind fail, %s.\n", strerror(errno)); return 1; } /* listen接口 */ listen(srv_sockfd, LISTENQ); sin_size = sizeof(struct sockaddr_in); /* 等待客户端连接请求 */ if ((cli_sockfd = accept(srv_sockfd, (struct sockaddr*)&cli_addr, &sin_size)) < 0) { fprintf(stderr, "create accept fail, %s.\n", strerror(errno)); return 1; } fprintf(stdout, "accept client %s\n", inet_ntoa(cli_addr.sin_addr)); sprintf(buf, "Hello client, ip:%s\n", inet_ntoa(cli_addr.sin_addr)); len = send(cli_sockfd, buf, strlen(buf), 0); /* 接受客户端数据 */ memset(&buf, 0, sizeof(char) * BUFSIZE); while((len = recv(cli_sockfd, buf, BUFSIZE, 0)) > 0) { buf[len] = '\0'; fprintf(stdout, "%s\n", buf); if (send(cli_sockfd, buf, len, 0) < 0) { /* 原样发回 */ fprintf(stderr, "create accept fail, %s.\n", strerror(errno)); return 1; } } close(cli_sockfd); close(srv_sockfd); return 0;}
TCP client
客户端建立步骤一般为:socket->connect
#include <stdio.h> /* stdin, stdout, stderr */#include <string.h> /* memset, strerror */#include <sys/types.h> /* socket, bind, listen, send */#include <sys/socket.h> /* socket, bind, listen, send */#include <netinet/in.h> /* sin_family, sin_port, sin_addr (man in.h) */#include <arpa/inet.h> /* inet_pton, htons (man inet.h) */#include <errno.h> /* errno */#define BUFSIZE 1024#define IP "127.0.0.1"#define PORT 8888#define LISTENQ 5/* * gcc tcp_client.c -o client * $ ./client * */int main(int argc, char *argv[]){ int cli_sockfd; size_t len; struct sockaddr_in srv_addr; char buf[BUFSIZE]; memset(&srv_addr, 0, sizeof(srv_addr)); srv_addr.sin_family = AF_INET; inet_pton(AF_INET, IP, &srv_addr.sin_addr); srv_addr.sin_port = htons(PORT); /* TCP: socket套接字 */ if ((cli_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { fprintf(stderr, "create socket fail, %s.\n", strerror(errno)); return 1; } /* connect server */ if (connect(cli_sockfd, (struct sockaddr*)&srv_addr, sizeof(struct sockaddr)) < 0) { fprintf(stderr, "create connect fail, %s.\n", strerror(errno)); return 1; } fprintf(stdout, "connected to server\n"); len = recv(cli_sockfd, buf, BUFSIZE, 0); buf[len] = '\0'; fprintf(stdout, "%s\n", buf); while(1) { fprintf(stdout, "Enter string to send:"); scanf("%s", buf); len = send(cli_sockfd, buf, strlen(buf), 0); len = recv(cli_sockfd, buf, BUFSIZE, 0); buf[len] = '\0'; fprintf(stdout, "received:%s\n", buf); } close(cli_sockfd); return 0;}
参考资料
[1] http://blog.csdn.net/piaojun_pj/article/details/5920888
[2] http://blog.sina.com.cn/s/blog_50571b1f010082pg.html
0 0
- linux socket编程学习
- linux socket 学习笔记
- Linux Socket学习二
- linux socket 学习笔记
- Linux Socket学习
- linux socket编程学习
- LINUX Socket学习笔记
- linux socket学习(一)
- linux socket学习(二)
- linux学习:socket编程
- Linux socket 学习
- linux socket学习(一)
- linux socket学习(二)
- linux socket学习(一)
- linux socket学习(二)
- Linux Socket学习(一)
- Linux Socket学习(二)
- Linux Socket学习(三)
- EhCache介绍
- 更新日志 - fir.im Jenkins & Gradle 插件上线
- 自动更新列表
- Linux中的进程管理
- 使用内核模块添加系统调用
- Linux socket 学习
- 解析XML几种方式
- CentOS 6.3 手动rpm包安装gcc、g++
- ReactNativeiOS(二)读书记录 6UI组件
- 两种方式实现页面数据绑定
- Alibaba-Dexposed Bug框架原理及源码解析
- Django学习记录之Django 1.8 教程(我只是官网的搬运工)Tutorial Part 2
- 第14周项目1-(1)验证折半查找算法
- Android WebView Cookie的相关设置和自定义错误页面加载