socket,linux用c语言实现

socket,linux用c语言实现,第1张

哦字符串回显啊unix网络编程有好几个版本,你可以去网上下它的源代码(百度搜UNIX网络编程 源代码),呃大部分被我的改的不成样了,发个能用的给看看吧

//server

#include<stdio.h>

#include<sys/socket.h>

#include<arpa/inet.h>

#include<netinet/in.h>

#include<stdlib.h>

#include<string.h>

#include<unistd.h>

#include<errno.h>

#include<signal.h>

#define SERVPORT 1956

#define MAXLINE 100

typedef void Sigfunc(int)

void sig_chld(int signo)

{

        pid_t pid

        int stat

        while( (pid = waitpid(-1, &stat, WNOHANG)) > 0)

                printf("child %d terminated\n", pid)

        return

}

//read data from client, and write back to them

void str_echo(int sockfd)

{

        ssize_t n

        char buf[MAXLINE]

        again:

        while( (n = read(sockfd, buf, MAXLINE)) > 0 )

                write(sockfd, buf, n)

        if(n < 0 && errno ==EINTR)

                goto again

        else if(n < 0 )

                printf("error\n")

}

int main(int argc, char** argv)

{

        int listenfd, connfd

        socklen_t clilen

        pid_t childpid

        struct sockaddr_in servaddr, cliaddr

        if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )

        {

                printf("socket fd error\n")

                return -1

        }

        bzero(&servaddr, sizeof(servaddr))

        servaddr.sin_family = AF_INET

        servaddr.sin_addr.s_addr = htonl(INADDR_ANY)

        servaddr.sin_port = htons(SERVPORT)

        if( bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) <0 )

        {

                printf("bind error\n")

                return -1

        }

        int backlong = 0

        if(listen(listenfd, backlong) <0 )

        {

                printf("listen error\n")

                return -1

        }

        signal(SIGCHLD, sig_chld)

        for()

        {

                clilen = sizeof(cliaddr)

                if( (connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen)) < 0)

                {

                        if(errno == EINTR)      continue

                        else printf("accept error\n")

                        return 0

                }

                printf("accept \n")

                if( (childpid = fork()) == 0 )

                {

                        close(listenfd)    //close child's listen socket

                        str_echo(connfd)

                        exit(0)

                }

                close(connfd)

        }

 } //client

#include<stdio.h>

#include<sys/socket.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include <stdlib.h>

#include <string.h>

#define MAXLINE 10

int main(int argc, char ** argv)

{

        int sockfd, n

        char recvline[MAXLINE+1]

        struct sockaddr_in servaddr,binaddr

        if(argc != 2)

        {

                printf("usage: <IPADDRESS>\n")

                return -1

        }

        if( (sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)

        {

                printf("socket error\n")

                return -1

        }

        bzero(&servaddr, sizeof(servaddr))

        servaddr.sin_family = AF_INET

        servaddr.sin_port = htons(15)

        if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr)<=0 )    

        {

                printf("inet_pton error for &s \n", argv[1])

                return -1

        }

        int bindSock

        binaddr.sin_family = AF_INET

        inet_pton(AF_INET, "222.26.224.56", &binaddr.sin_addr)

        binaddr.sin_port = htons(20000)

        int reuse0 = 1

        if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse0, sizeof(reuse0)) == -1)

        {

                printf("set socket error\n")

                return -1

        }

        if( bind(sockfd, (struct sockaddr *)&binaddr, sizeof(servaddr)) <0 )

        {

                printf("bind error\n")

                return -1

        }

        if( connect(sockfd, (struct sockaddr*) &servaddr, sizeof(servaddr) ) < 0 )

        {

                printf("connection refuse\n")

                return -1

        }

        while( (n = read(sockfd, recvline, MAXLINE)) > 0 )

        {

                recvline[n] = 0

                if(fputs(recvline, stdout) == EOF)

                {

                        printf("fputs error")

                        return -1

                }

                printf("\n")

        }

        if(n < 0 )

        {

                printf("read error")

                return -1

        }

}

Socket通信创建步骤:

(1)通过socket()函数创建socket

(2)通过bind函数绑定socket于设备地址

(3)进行读写 *** 作read/recv/recvfrom write/send/sendto

(4)close方法关闭套接字

例子如下:

test1.c

#include <stdio.h>  

#include <stdlib.h>  

#include <unistd.h>  

#include <netinet/in.h>  

#include <arpa/inet.h>  

  

int main(void)  

{  

    //create socket  

    int fd = socket(AF_INET, SOCK_DGRAM, 0)  

    if(fd==-1)  

    {  

        perror("socket\n")  

        exit(-1)  

    }  

    printf("socket fd=%d\n",fd)  

  

    //build connection address  

    struct sockaddr_in addr  

    addr.sin_family = AF_INET  

    addr.sin_port = htons(6666)  

    addr.sin_addr.s_addr = inet_addr("127.0.0.1")  

  

    int r  

    r = bind(fd,(struct sockaddr*)&addr,sizeof(addr))  

    if(r==-1)  

    {  

        perror("bind")  

        close(fd)  

        exit(-1)  

    }  

    printf("bind address successful!\n")  

    //accept or send message  

    char buf[255]  

    struct sockaddr_in from  

    socklen_t len  

    len = sizeof(from)  

    while(1)  

    {  

        r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&from,&len)  

        if(r>0)  

        {  

            buf[r]=0  

            printf("The message from %s is:%s\n",inet_ntoa(from.sin_addr),buf)  

        }  

        else  

        {  

            break  

        }  

    }  

    //close socket  

    close(fd)  

    return 0  

}

test2.c

#include <stdio.h>  

#include <stdlib.h>  

#include <unistd.h>  

#include <string.h>  

#include <sys/socket.h>  

#include <netinet/in.h>  

#include <arpa/inet.h>  

  

int main(void)  

{  

    //create socket  

    int fd = socket(AF_INET,SOCK_DGRAM,0)  

    if(fd==-1)  

    {  

        perror("socket")  

        exit(-1)  

    }  

    printf("create socket OK!\n")  

    //create an send address  

    struct sockaddr_in addr={}  

    addr.sin_family = AF_INET  

    addr.sin_port = htons(6666)  

    addr.sin_addr.s_addr=inet_addr("127.0.0.1")  

    //send the message to the specify address  

    int r  

    char buf[255]  

    while(1)  

    {  

        r = read(0,buf,sizeof(buf)-1)  

        if(r<=0)  

            break  

        sendto(fd,buf,r,0,(struct sockaddr*)&addr,sizeof(addr))  

    }  

    //close socket  

    close(fd)  

    return 0  

}

运行test1.c,然后运行test2.c,在test2.c运行后输入内容,在test1.c所在终端中就会显示信息

运行结果如下:

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。 注意运行命令是“点 斜杠”,“点”表示当前目录。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存