C语言socket编程——linux环境

先写一个服务器端的监听程序,功能室从客户端读取字符,接收到后告知客户端“I got your message:
”+收到的消息:server.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

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连接的稍后补上

时间: 2024-12-27 03:28:59

C语言socket编程——linux环境的相关文章

计算机网络|C语言Socket编程,实现两个程序间的通信

C语言Socket编程,实现两个程序间的通信 server和client通信流程图 在mooc上找到的,使用Socket客户端client和服务端server通信的流程图?? 服务端server 服务端需要 "两个"套接字 : 1.服务端套接字serverSocket 2.客户端connect连接请求时,发来的套接字clientSocket 按流程图来看, server服务端主要就是实现下面几个步骤: 0.WSAStartup初始化 //这个东西也不知道是什么鬼,反正就是要初始化一下,

C语言SOCKET编程指南

1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等等… 好在我已经将这些事完成了,我将和所有人共享我的知识了.如果你了解 C语言并想穿过网络编程的沼泽,那么你来对地方了. 2.读者对象 这个文档是一个指南,而不是参考书.如果你刚开始 socket 编程并想找一本入门书,那么你是我的读者.但这不是一本完全的 socket 编程书. 3.平台和编译器

多种语言socket编程集锦—win32

原文 http://www.blogjava.net/huyi2006/articles/263831.html 借此地方整理以下socket编程的多种语言的实现,socket可以跨平台的通信,因此多语言.多平台下的实现有必要了解的.代码都是源自网上,感谢网友的分享. socket编程在windows下的C语言实现,dev C++下编译通过编译时设置编译选项 工具-->编译选项-->编译器,勾选在连接器命令行加入以下命令,在对话框中填-lwsock32//server.c#include &l

C语言Socket编程(计算机网络作业)

最近我计算机网络课程要做作业了,没办法跟着老师一步一步的写C语言的代码,使用的计算就是Socket通信发送消息:代码实现的功能很简单,客户端向服务器端发送消息,服务器端接收客户端发来的消息,并且输出显示到屏幕上:代码中的每个方法的返回值都应该做判断出错情况,以保证程序的稳定性,这里只是测试代码. 老师是录制的视频讲解的,其他其中使用的到的方法要求我们自己去查相关的MSDN资料库,如果有不懂的,就自己上网查. 服务器端接收代码: #include <Winsock2.h>#pragma comm

c语言socket编程

1. [代码][C/C++]代码     服务端:////  main.m//  server////  Created by mac on 13-4-15.//  Copyright (c) 2013年 mac. All rights reserved.// #import <Foundation/Foundation.h>#import <sys/types.h>#import <sys/socket.h>#import <netinet/in.h>#i

Go语言系列(九)- Socket编程和Redis

Socket编程 一.socket编程概述 什么是socket编程? socket编程是计算机PC机器上2个程序通过一个双向的通信连接实现数据的交互,这个连接的一端就是一个socket.socket的翻译意思上还有个插座的概念,其实,也可以很形象的比喻为插座插上去了就有通电了(网络通了).socket编程其实作为UNIX系统的进程间通信机制,通常称为“套接字”,用来描述IP地址和端口的集合,在unix系统下是一个通信的句柄(文件描述符,因为UNIX下所有都是文件). UNIX socket编程的

Go语言之Go语言网络编程

GO 语言网络编程 Go 语言Socket编程 TCP Socket Go语言的 net 包中有一个 TCPConn 类型,可以用来建立 TCP 客户端和 TCP 服务器端间的通信通道,TCPConn 类型里有两个主要的函数: func (c *TCPConn) Write(b []byte) (n int, err os.Error) func (c *TCPConn) Read(b []byte) (n int, err os.Error) CPConn 可以用在客户端和服务器端来读写数据.

C语言 linux环境基于socket的简易即时通信程序

转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html   By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易的C/S即时通信程序,代码如下: head.h 1 /*头文件,client和server编译时都需要使用*/ 2 #include <unistd.h> 3 #include <stdio.h> 4 #include <sys/types.h> 5 #include <sys

Golang在Linux环境下的POSIX风格socket编程

这里给出一个服务端和客户端,服务端可以接受多个连接,并且利用Go的杀手特性go和channel来替代select进行数据的接收. 服务端: package main import ( "fmt" . "syscall" ) func RecvRoutine(sockfd int, session chan string) { var buffer []byte = make([]byte, 3000) for { if length, err := Read(soc