1、创建套接字
例:int sockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0);
socket () 函数:
int socket(int domain, int type, int protocol)
//参数domain;设置网络通信的域,即选择通信协议族。AF_INET为IPv4
//参数type:设置套接字通信的类型,主要有SOCK_STREAM(流式套接字,TCP连接)、SOCK_DGRAM(数据包套接字,UDP连接)
//参数protocol:制定type协议类型中的某个特定类型。通常某协议中只有一种特定类型,即protocol参数仅能设为0
//创建 套接字
2、结构体 struct sockaddr_in //库 <netinet/in.h>
//short int sin_family; 协议族,在socket编程中 只能是AF_INET
//unsigned short int sin_port; 端口号,使用网络字节顺序
//struct in_addr sin_addr; 含unsigned long s_addr; 存储IP地址
//unsigned char sin_zero[8];
例:
struct sockaddr_in servAddr;
bzero(&servAddr, sizeof(servAddr)); //初始化 servAddr变量
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(8888);
servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
3、客户端 连接 、 读取
例:
connect(sockfd, (struct sockaddr *)&servAddr, sizeof(servAddr)); //连接 套接字 和 IP
int rcvLen; rcvLen = read(sockfd, rcvbuf, 128); //读取 信息
4、函数 setsockopt() //设置套接字属性
//int setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen);
//参数s;套接字,指向一个打开的套接口描述符
//参数level:级别,SOL_SOCKET(基本套接口)
//参数optname:选项名,SO_REUSEADDR(允许套接口和已使用的地址捆绑)
//参数optval:选项值,
//参数optlen:选项长度,
例:
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); //设置套接字属性
5、服务端 绑定、监听、写入
例:
bind(sockfd, (struct sockaddr *)&serAddr, sizeof(struct sockaddr)); //绑定 套接字 和 IP、端口
listen(sockfd, 2); //设置 可同时监听的最大数量
listenfd = accept(sockfd, (struct sockaddr *)&cliAddr,&len);
write(sockfd,"test",5);
代码(其一):
1 #include <stdio.h>
2 #include <netinet/in.h>
3 #include <string.h>
4 #include <time.h>
5
6 int main(int argc, char *argv[])
7 {
8 int sockfd, listenfd;
9 int opt = 1;
10
11 struct sockaddr_in serAddr, cliAddr;
12 socklen_t len;
13
14 time_t mytime;
15 char buf[128];
16
17 sockfd = socket(AF_INET, SOCK_STREAM, 0);
18 printf("server socket create success. sockfd = %d\n", sockfd);
19 printf(" ***********************************\n");
20
21 //int setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen);
22 //参数s;套接字,指向一个打开的套接口描述符
23 //参数level:级别,SOL_SOCKET(基本套接口)
24 //参数optname:选项名,SO_REUSEADDR(允许套接口和已使用的地址捆绑)
25 //参数optval:选项值,
26 //参数optlen:选项长度,
27 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); //设置套接字属性
28
29 bzero(&serAddr, sizeof(serAddr)); //初始化 serAddr变量
30 serAddr.sin_family = AF_INET;
31 serAddr.sin_port = htons(8888);
32 serAddr.sin_addr.s_addr = htonl(INADDR_ANY);
33
34 //server端 bind 绑定
35 bind(sockfd, (struct sockaddr *)&serAddr, sizeof(struct sockaddr)); //绑定 套接字 和 IP、端口
36 listen(sockfd, 2); //设置 可同时监听的最大数量
37
38 printf("waiting for being connected ......\n");
39 listenfd = accept(sockfd, (struct sockaddr *)&cliAddr,&len);
40 printf("finish connect listenfd = %d\n", listenfd);
41 printf(" **********************\n");
42 if(listenfd < 0)
43 {
44 perror("ERROR: accept failure.\n");
45 return -1;
46 }
47
48 mytime = time(NULL);
49 snprintf(buf, sizeof(buf), "%s", ctime(&mytime)); //缓存变量
50
51 // write(sockfd,"test",5);
52 write(listenfd, buf, strlen(buf)); //写入(发送)
53 printf("send socket[%d bytes]: %s\n", strlen(buf), buf);
54 close(sockfd);
55 return 0;
56 }
代码(其二):
1 #include <stdio.h>
2 #include <netinet/in.h>
3 #include <string.h>
4 //#include <sys/socket.h>
5
6 int main(int argc, char *argv[])
7 {
8 int sockfd;
9
10 //short int sin_family; 协议族,在socket编程中 只能是AF_INET
11 //unsigned short int sin_port; 端口号,使用网络字节顺序
12 //struct in_addr sin_addr; 含unsigned long s_addr; 存储IP地址
13 //unsigned char sin_zero[8];
14 struct sockaddr_in servAddr; //库 <netinet/in.h>
15
16 int rcvLen;
17 char rcvbuf[128];
18
19 //int socket(int domain, int type, int protocol)
20 //参数domain;设置网络通信的域,即选择通信协议族。AF_INET为IPv4
21 //参数type:设置套接字通信的类型,主要有SOCK_STREAM(流式套接字,TCP连接)、SOCK_DGRAM(数据包套接字,UDP连接)
22 //参数protocol:制定type协议类型中的某个特定类型。通常某协议中只有一种特定类型,即protocol参数仅能设为0
23 sockfd = socket(AF_INET, SOCK_STREAM, 0); //创建 套接字
24 printf("client socket create success. sockfd = %d\n", sockfd);
25
26 bzero(&servAddr, sizeof(servAddr)); //初始化 servAddr变量
27 servAddr.sin_family = AF_INET;
28 servAddr.sin_port = htons(8888);
29 servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
30
31 //client端 connect 连接
32 connect(sockfd, (struct sockaddr *)&servAddr, sizeof(servAddr)); //连接 套接字 和 IP
33 rcvLen = read(sockfd, rcvbuf, 128); //读取 信息
34
35 if(rcvLen < 0)
36 {
37 printf("ERROR: read failure.\n");
38 return -1;
39 }
40 if(rcvLen == 0)
41 {
42 printf("Server close connection.\n");
43 return -1;
44 }
45 printf("receive data[%d bytes]: %s\n", rcvLen, rcvbuf);
46
47 close(sockfd);
48
49 return 0;
50 }
执行: