Linux下C语言socket编程

Linux下C语言socket编程,第1张

socket编程一般是基于tcp或者udp协议来写的,你的问题很抽象,我不知道你要的是基于tcp还是udp的socket编译。我把相对难的基于tcp协议的socket编译给你吧。你想看懂我的代码需要知道tcp的三次握手机制。否则我写了注释,你看代码也有点困难。 ////服务端的代码

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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8975588.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-23
下一篇2023-04-23

发表评论

登录后才能评论

评论列表(0条)

    保存