socket编程——一个简单的例子
来源:互联网 发布:js 鼠标移到图片放大 编辑:程序博客网 时间:2024/04/30 12:44
转载自:http://blog.csdn.net/wind19/article/details/6156339
从一个简单的使用TCP例子开始socket编程,其基本步骤如下:
server client
+++++++ ++++++++
创建socket 创建socket
+++++++ ++++++++
| |
| |
| |
+++++++ ++++++++
地址赋值( 地址赋值(
自己的地址) 服务器地址)
+++++++ ++++++++
| |
| |
| |
++++++++ |
用bind绑定 |
socket和地址 |
++++++++ |
| |
| |
| |
+++++++ |
listen |
+++++++ |
| ++++++++++
| <------------------------------ connect 服务器
| ++++++++++
+++++++ |
accept |
+++++++ |
| |
| +++++++++
| recv 和send
| 进行数据处理
| +++++++++
+++++++++ |
用accept得到 |
的socket进行 |
recv 和 send |
+++++++++ |
| |
| |
| |
+++++++++ +++++++++
close socket close socket
+++++++++ +++++++++
根据以上步骤,服务器端的代码为
从一个简单的使用TCP例子开始socket编程,其基本步骤如下:server client +++++++ ++++++++创建socket 创建socket+++++++ ++++++++ | | | | | |+++++++ ++++++++地址赋值( 地址赋值(自己的地址) 服务器地址)+++++++ ++++++++ | | | | | |++++++++ |用bind绑定 |socket和地址 |++++++++ | | | | | | |+++++++ |listen |+++++++ | | ++++++++++ | <------------------------------ connect 服务器 | +++++++++++++++++ |accept |+++++++ | | | | +++++++++ | recv 和send | 进行数据处理 | ++++++++++++++++++ |用accept得到 |的socket进行 |recv 和 send |+++++++++ | | | | | | |+++++++++ +++++++++close socket close socket+++++++++ +++++++++ 根据以上步骤,服务器端的代码为
客户端代码为:
#include <stdio.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <syslog.h>#include <errno.h>#include <stdlib.h>#define MAX_LISTEN_NUM 5#define SEND_BUF_SIZE 100#define RECV_BUF_SIZE 100#define SERVER_PORT 1010int main(){ int sock_fd = 0; char recvbuf[RECV_BUF_SIZE] = {0}; char sendbuf[SEND_BUF_SIZE] = {0}; int recvlen = 0; int retlen = 0; int sendlen = 0; int leftlen = 0; char *ptr = NULL; struct sockaddr_in ser_addr; memset(&ser_addr, 0, sizeof(ser_addr)); ser_addr.sin_family = AF_INET; inet_aton("127.0.0.1", (struct in_addr *)&ser_addr.sin_addr); ser_addr.sin_port = htons(SERVER_PORT); sock_fd = socket(AF_INET, SOCK_STREAM, 0); if(sock_fd < 0) { syslog(LOG_ERR, "%s:%d, create socket failed", __FILE__, __LINE__); exit(1); } if(connect(sock_fd, (struct sockaddr *)&ser_addr, sizeof(ser_addr)) < 0) { syslog(LOG_ERR, "%s:%d, connect socket failed", __FILE__, __LINE__); exit(1); } //receive data recvlen = 0; retlen = 0; ptr = recvbuf; leftlen = RECV_BUF_SIZE -1; //do { retlen = recv(sock_fd, ptr, leftlen, 0) ; if(retlen < 0) { if(errno == EINTR) retlen = 0;elseexit(1); } recvlen += retlen; leftlen -= retlen; ptr += retlen; } //while(recvlen && leftlen); printf("receive data is : %s", recvbuf); sprintf(sendbuf, "hello server/n"); //send data sendlen = strlen(sendbuf) +1; retlen = 0; leftlen = sendlen; ptr = sendbuf; // while(leftlen) { retlen = send(sock_fd, ptr, sendlen, 0); if(retlen < 0) { if(errno == EINTR) retlen = 0;elseexit(1); } leftlen -= retlen; ptr += retlen; } close(sock_fd); }
现在一个简单的使用tcp的socket通信的例子已经完成了,这里有几个需要说明的问题
1)头文件:
sys/socket.h 包含了socket相关的函数,如socket,send 和recv, 以及struct sockaddr等
netinet/in.h 包含了地址结构,如struct sockaddr_in
errno.h 包含了errno 和 EINTR
syslog.h 包含了syslog相关的信息,其打印结果在/var/log/messages里面
2)socket地址
对于IPv4来说,其地址用的是struct sockaddr_in,具体结构如下
struct in_addr { in_addr_t s_addr; /* 32-bit IPv4 address */ /* network byte ordered */};struct sockaddr_in { uint8_t sin_len; /* length of structure (16) */ sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* 16-bit TCP or UDP port number */ /* network byte ordered */ struct in_addr sin_addr; /* 32-bit IPv4 address */ /* network byte ordered */ char sin_zero[8]; /* unused */};
其中sin_len我们一般不关注,也不填(只有在使用routing socket的时候才用到,被内核用来处理各种协议簇的地址结构)。bind, connect, sendto, 和 sendmsg会把socket地址从程序传递给内核; 而accept, recvfrom, recvmsg, getpeername, 和 getsockname会把地址从内核传递给程序。因为不同协议簇的地址结构是不一样的,所以必须要有一个通用的指针来传递地址,对于ANSI C来说我们一般使用void *,但是socket产生早于ANSI C,所以也就没有使用这个机制,而是使用一个通用的地址结构struct sockaddr来处理的
- socket编程——一个简单的例子
- socket编程——一个简单的例子
- socket编程——一个简单的例子
- socket编程——一个简单的例子
- socket编程——一个简单的例子
- socket编程——一个简单的例子
- socket编程——一个简单的例子
- 一个Socket网络编程的简单例子
- 一个简单的java socket编程例子
- 一个简单的socket例子
- 一个简单socket的例子
- 一个简单的socket例子
- win32 socket的一个简单的例子
- 非常简单的socket编程例子
- 一个关于linux socket的简单例子
- 一个最简单的Socket通信例子
- 一个最简单的socket通讯例子
- 一个关于linux socket的简单例子
- Linux下I/O多路转接之epoll
- 预先定义ID,后面再使用
- 【博弈】HackerRank _ stone_division
- ssh 提示Connection closed by * 的解决方案
- 合并排序的递归实现算法
- socket编程——一个简单的例子
- Vue.js 快速搭建
- 飞机大战(五)
- POI分sheet导出Excel或者zip通用高速方法(万条数据以上)
- 整理整理
- VMware Workstation网络连接问题
- [mysql] centos 安装 mysql 后,提示密码错误
- Python读取文件编码及内容
- MySql 100万级别数据中随机获取一条或多条记录之RAND()优化