
1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/socket.h>
4 #include <unistd.h>
5 #include <netinet/in.h>
6 #include <sys/stat.h>
7 #include <stdlib.h>
8 #include <arpa/inet.h>
9
10 #define LOCAL_PORT 1234
11 #define MAX_LEN 512
12 #define MAX_NUM 5
13
14 int main(int argc, char *argv[])
15 {
16 int sock_fd, sock_data
17 int ret, len_addr
18 char buf[MAX_LEN]
19 ssize_t len
20 struct sockaddr_in local_addr, remote_addr
21
22 sock_fd = socket(AF_INET, SOCK_STREAM, 0)//创建套接字,sock_fd是套接字描述符,类似我们的身份z号码
23 if (sock_fd <0)
24 {
25 perror("socket()")
26 return sock_fd
27 }
28
29 local_addr.sin_family = AF_INET// 协议族,ipv4
30 local_addr.sin_port = htons(LOCAL_PORT)// 把服务器端口转换成网络字节序
31 local_addr.sin_addr.s_addr = inet_addr("127.0.0.1")//把字符串形式的ip转换成网络字节序
32
33 ret = bind(sock_fd, (struct sockaddr *)&local_addr, (size_t)sizeof(local_addr))// 把sock_fd和本机ip,端口邦定
34 if (ret <0)
35 {
36 perror("bind()")
37 close(sock_fd)
38 return ret
39 }
40
41 ret = listen(sock_fd, MAX_NUM)//监听socket
42 if (ret)
43 {
44 perror("listen()")
45 close(sock_fd)
46 return ret
47 }
48
49 memset(buf, 0, MAX_LEN)
50
51 len_addr = sizeof(remote_addr)
52
53 sock_data = accept(sock_fd, (struct sockaddr *)&remote_addr, (socklen_t *)&len_addr)//接受客户端的连接
54 if (ret <0)
55 {
56 perror("accept()")
57 close(sock_fd)
58 return ret
59 }
60
61 while (1)
62 {
63 int slen
64 len = recv(sock_data, buf, MAX_LEN, 0)//接受客户端的数据
65 if (len <0)
66 {
67 perror("recv()")
68 close(sock_data)
69 close(sock_fd)
70 return len
71 }
72 printf("%s\n", buf)
73
74 slen = send(sock_data, "congratulation!", 15, 0)//向客户端发送数据
75 if (slen <= 0)
76 {
77 printf("slen = %d\n", slen)
78 perror("send()")
79 close(sock_data)
80 close(sock_fd)
81 return slen
82 }
83 sleep(1)
84 }
85
86 close(sock_data)
87 close(sock_fd)
88
89 return 0
90 }
////////////客户端的代码 1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/socket.h>
4 #include <unistd.h>
5 #include <netinet/in.h>
6 #include <sys/stat.h>
7 #include <stdlib.h>
8 #include <arpa/inet.h>
9
10 #define REMOTE_PORT 1234
11 #define MAX_LEN 512
12
13 int main(int argc, char *argv[])
14 {
15 int sock_fd, ret
16 int len
17 char buf[MAX_LEN]
18 struct sockaddr_in local_addr, remote_addr
19
20 sock_fd = socket(AF_INET, SOCK_STREAM, 0)
21 if (sock_fd <0)
22 {
23 perror("socket()")
24 return sock_fd
25 }
26
28 local_addr.sin_family = AF_INET
29 local_addr.sin_addr.s_addr = htonl(INADDR_ANY)//自动获取本机的ip地址
30 local_addr.sin_port = htons(0)//随机选取可用的端口,并不是指定端口为0
31
33 remote_addr.sin_family= AF_INET
34 remote_addr.sin_port = htons(REMOTE_PORT)
35 ret = inet_aton("127.0.0.1", &remote_addr.sin_addr)
36
38 ret = bind(sock_fd, (struct sockaddr *)&local_addr, sizeof(local_addr)) //把本机的ip,port和socket绑定
39 if (ret <0)
40 {
41 perror("bind() !")
42 close(sock_fd)
43 return ret
44 }
45
47 ret = connect(sock_fd, (struct sockaddr *)&remote_addr, (socklen_t)sizeof(remote_addr)) //把本机的socket和对方的port,ip建立连接
48 if (ret <0)
49 {
50 perror("connect()")
51 close(sock_fd)
52 return ret
53 }
54
55 memset(buf, 0, MAX_LEN)
56
57 while (1)
58 {
59 int i
60 // len = send(sock_fd, buf, (size_t)MAX_LEN, 0)
61 len = send(sock_fd, "hello", 6, 0)
62 if (len <= 0)
63 {
64 perror("send()")
65 close(sock_fd)
66 return ret
67 }
68
69 // printf("%d-->bytes send!\n", len)
70 sleep(1)
71
72 len = recv(sock_fd, buf, MAX_LEN, 0)
73 if (len <= 0)
74 {
75 perror("recv()")
76 close(sock_fd)
77 return ret
78 }
79
80 for (i = 0i <leni++)
81 {
82 printf("%c", buf[i])
83 }
84 printf("\n")
85 }
86
87 close(sock_fd)
88
89 return 0
90 }
你把服务端和客户端这两个程序分别保存为server.c和client.c。然后编译gcc server.c -o server,gcc client .c -o client。运行时先运行服务端,用命令./server,再运行客户端,用命令./client。 注意运行命令是“点 斜杠”,“点”表示当前目录。
在Linux下面,如果要编译一个C语言源程序,我们要使用gcc编译器。
先将源文件编译成目标文件:gcc - c hello.c
生成hello.o文件,再将目标文件编译成可执行文件:gcc -o hello hello.o
如:
int main(int argc,char **argv)
{
printf("Hello Linux\n")
}
扩展资料:
在使用GCC编译器的时候,我们必须给出一系列必要的调用参数和文件名称。GCC编译器的调用参数大约有100多个,这里只介绍其中最基本、最常用的参数。具体可参考GCC Manual。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是编译器所需要的参数,filenames给出相关的文件名称。
参考资料:
百度百科_gcc
linux终端下,编译C语言程序步骤为:采用vi进行源代码编写,编写完成后,:wq存盘退出,如:
vi test.c
在命令行下,运行gcc编译程序,生成执行码,如:
gcc -o test test.c
-o 表示指明生成的执行码名称
运行编译后的执行码
./test
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)