1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define MAXLINE 1000 #define SERV_PORT 9931 void
doprocessing( int
sock, struct
sockaddr_in cliaddr) { int
n; char
str[INET_ADDRSTRLEN]; char
*buf = ( char
*) malloc (MAXLINE); char
*reply = ( char
*) malloc (MAXLINE*2); memset (buf, ‘\0‘ , MAXLINE); while
(1) { n = read(sock, buf, MAXLINE); strcpy (reply, "I got your message: " ); if
(n < 0) { perror ( "Error reading from socket!" ); return ; } else
{ printf ( "Connect from %s:%d\n" , inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof (str)), ntohs(cliaddr.sin_port)); strcat (reply,buf); printf ( "receive %s\n" ,buf); write(sock, reply, MAXLINE); } memset (buf,0, sizeof ( char )*MAXLINE); memset (reply,0, sizeof ( char )*MAXLINE); } free (reply); free (buf); } int
main( void ) { struct
sockaddr_in servaddr, cliaddr; int
listenfd, connfd, pid; socklen_t cliaddr_len = sizeof (cliaddr); listenfd = socket(AF_INET, SOCK_STREAM, 0); if
(listenfd < 0) { perror ( "Error opening socket!" ); exit (-1); } memset (&servaddr, 0, sizeof ( struct
sockaddr_in)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr( "10.13.81.182" ); servaddr.sin_port = htons(SERV_PORT); bind(listenfd, ( struct
sockaddr *)&servaddr, sizeof (servaddr)); listen(listenfd, 2000); printf ( "server服务器开始等待客户端连接 ...\n" ); while
(1) { connfd = accept(listenfd, ( struct
sockaddr *)&cliaddr, &cliaddr_len); pid = fork(); if
(pid == -1) { perror ( "call to fork" ); exit (-1); } else
if (pid == 0) { close(listenfd); doprocessing(connfd, cliaddr); exit (0); } else
{ close(connfd); } } return
0; } |
再写一个客户端通过socket通信向服务器发送数据的代码:cli.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define MAXLINE 1000 #define SERV_PORT 9931 int
main( int
argc, char
*argv[]) { struct
sockaddr_in servaddr; char
*buf = ( char
*) malloc (MAXLINE); char
*rec = ( char
*) malloc (MAXLINE); int
servfd, n; servfd = socket(AF_INET, SOCK_STREAM, 0); memset (&servaddr, 0, sizeof (servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr( "10.13.81.182" ); servaddr.sin_port = htons(SERV_PORT); connect(servfd, ( struct
sockaddr *)&servaddr, sizeof (servaddr)); while
( fgets (buf, MAXLINE, stdin)!= NULL) { write(servfd, buf, strlen (buf)); n = read(servfd, rec, MAXLINE); if
(n == 0) { perror ( "The other side has been closed." ); exit (-1); } else
{ printf ( "从服务器返回的信息为:%s\n" , rec); } memset (rec,0, sizeof ( char )*MAXLINE); memset (buf,0, sizeof ( char )*MAXLINE); } close(servfd); return
0; } |
关于TCP连接的稍后补上
C语言socket编程——linux环境,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/corolla/p/3757968.html