时间:2017-4-11来源:本站原创作者:佚名

1.什么是TCP/IP、UDP?

2.Socket在哪里呢?

3.Socket是什么呢?

4.有很多的框架,为什么还在从Socket开始?

5.LinuxCSocket简单示例

1.什么是TCP/IP、UDP?

  TCP/IP(TransmissionControlProtocol/InternetProtocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。   UDP(UserDataProtocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。   下面的图表明了这些协议的关系。

2.Socket在哪里呢?

3.Socket是什么呢?

  Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

  门面模式,用自己的话说,就是系统对外界提供单一的接口,外部不需要了解内部的实现。

4.有很多的框架,为什么还在从Socket开始?

  现在的跨平台网络编程框架很多,如Java的SSH,C/C++的Boost等。

  现在的分布式框架很多,如Hadoop等。

  我的任务是把一个C/C++程序做成分布式,要求的不配环境,基本属于纯计算的,结果很小。所以选择了Socket。

  重要的是Socket是分布式、云计算、网络编程的基础,对Socket的学习有利于对其他框架的理解。

  下图是Socket编程的基本流程:

5.LinuxCSocket简单实例与详细注释

程序为简单的“回射”,客户端将控制台输入的信息发送给服务器端,服务器原样返回信息。

服务器端:

1#includesys/types.h

2#includesys/socket.h

3#includestdio.h

4#includenetinet/in.h

5#includearpa/inet.h

6#includeunistd.h

7#includestring.h

8#includestdlib.h

9#includefcntl.h

10#includesys/shm.h

11

12#defineMYPORT

13#defineQUEUE20

14#defineBUFFER_SIZE

15

16intmain()

17{

18///定义sockfd

19intserver_sockfd=socket(AF_INET,SOCK_STREAM,0);

20

21///定义sockaddr_in

22structsockaddr_inserver_sockaddr;

23server_sockaddr.sin_family=AF_INET;

24server_sockaddr.sin_port=htons(MYPORT);

25server_sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);

26

27///bind,成功返回0,出错返回-1

28if(bind(server_sockfd,(structsockaddr*)server_sockaddr,sizeof(server_sockaddr))==-1)

29{

30perror(bind);

31exit(1);

32}

33

34///listen,成功返回0,出错返回-1

35if(listen(server_sockfd,QUEUE)==-1)

36{

37perror(listen);

38exit(1);

39}

40

41///客户端套接字

42charbuffer[BUFFER_SIZE];

43structsockaddr_inclient_addr;

44socklen_tlength=sizeof(client_addr);

45

46///成功返回非负描述字,出错返回-1

47intconn=accept(server_sockfd,(structsockaddr*)client_addr,length);

48if(conn0)

49{

50perror(connect);

51exit(1);

52}

53

54while(1)

55{

56memset(buffer,0,sizeof(buffer));

57intlen=recv(conn,buffer,sizeof(buffer),0);

58if(strcmp(buffer,exit\n)==0)

59break;

60fputs(buffer,stdout);

61send(conn,buffer,len,0);

62}

63close(conn);

64close(server_sockfd);

65return0;

66}

客户端:

1#includesys/types.h

2#includesys/socket.h

3#includestdio.h

4#includenetinet/in.h

5#includearpa/inet.h

6#includeunistd.h

7#includestring.h

8#includestdlib.h

9#includefcntl.h

10#includesys/shm.h

11

12#defineMYPORT

13#defineBUFFER_SIZE

14

15intmain()

16{

17///定义sockfd

18intsock_cli=socket(AF_INET,SOCK_STREAM,0);

19

20///定义sockaddr_in

21structsockaddr_inservaddr;

22memset(servaddr,0,sizeof(servaddr));

23servaddr.sin_family=AF_INET;

24servaddr.sin_port=htons(MYPORT);///服务器端口

25servaddr.sin_addr.s_addr=inet_addr(.0.0.1);///服务器ip

26

27///连接服务器,成功返回0,错误返回-1

28if(connect(sock_cli,(structsockaddr*)servaddr,sizeof(servaddr))0)

29{

30perror(connect);

31exit(1);

32}

33

34charsendbuf[BUFFER_SIZE];

35charrecvbuf[BUFFER_SIZE];

36while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL)

37{

38send(sock_cli,sendbuf,strlen(sendbuf),0);///发送

39if(strcmp(sendbuf,exit\n)==0)

40break;

41recv(sock_cli,recvbuf,sizeof(recvbuf),0);///接收

42fputs(recvbuf,stdout);

43

44memset(sendbuf,0,sizeof(sendbuf));

45memset(recvbuf,0,sizeof(recvbuf));

46}

47

48close(sock_cli);

49return0;

50}

执行:

客户端

服务器端









































如何治疗白癜风土方
治白癜风的药

转载请注明原文网址:http://www.gzdatangtv.com/jsyy/6468.html
------分隔线----------------------------