随笔 - 60, 文章 - 0, 评论 - 197, 引用 - 0
数据加载中……

Linux 下 socket 编程示例

本示例为 Client/Server 结构,通过代码演示 Client 如何建立连接,并向远程端发送数据;Server 端如何侦听系统连接请求,接收请求并建立连接,进而获取客户端发来的数据。代码虽短,却描述了整个通信过程,可对Linux 下 网络编程起个抛砖引玉的作用吧 :-)

Client 端代码:
--------------------------------------------------------------
/* sockclnt.c*/
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /*for struct sockaddr_in*/

#define DEST_IP   "65.52.207.217"
#define DEST_PORT 4000

int main()
{
  int res;
  int sockfd;
  struct sockaddr_in dest_addr;

  char *msg = "Hello world\n";
  int len, bytes_sent;

  /* 取得一个套接字*/
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if (sockfd == -1) {
    perror("socket()");
    exit(1);
  }

  /* 设置远程连接的信息*/
  dest_addr.sin_family = AF_INET;                 /* 注意主机字节顺序*/
  dest_addr.sin_port = htons(DEST_PORT);          /* 远程连接端口, 注意网络字节顺序*/
  dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); /* 远程 IP 地址, inet_addr() 会返回网络字节顺序*/
  bzero(&(dest_addr.sin_zero), 8);                /* 其余结构须置 0*/

  /* 连接远程主机,出错返回 -1*/
  res = connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in));
  if (res == -1) {
    perror("connect()");
    exit(1);
  }

  len = strlen(msg);
  bytes_sent = send(sockfd, /* 连接描述符*/
                    msg,    /* 发送内容*/
                    len,    /* 发关内容长度*/
                    0);     /* 发送标记, 一般置 0*/

  /* 关闭连接*/
  close(sockfd);
}


Server 端的代码:
-----------------------------------------------------------------------------------------
/* socksrv.c*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /* for struct sockaddr_in*/

#define BACKLOG 10
#define MYPORT  4000

int main()
{
  char *addr;
  int sockfd;
  int new_fd;
  struct sockaddr_in my_addr, their_addr;

  int res;
  int sin_size;

  char *buf;
  /* 取得套接字描述符*/
  sockfd = socket(AF_INET,     /* domain*/
                  SOCK_STREAM, /* type*/
                  0);          /* protocol*/

  if (sockfd == -1) {
    perror("socket");
    exit(1);
  }

  /* Init sockaddr_in */
  my_addr.sin_family = AF_INET;                /* 注意: 应使用主机字节顺序*/
  my_addr.sin_port = htons(MYPORT);            /* 注意: 应使用网络字节顺序*/
  my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 使用自己的 IP 地址 */
  bzero(&(my_addr.sin_zero), 8);               /* 结构的其余的部分须置 0*/

  /* 指定一个套接字使用的地址及端口*/
  res = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));
  if (res == -1) {
    perror("bind");
    exit(1);
  }

  /* 监听请求, 等待连接*/
  res = listen(sockfd,
               BACKLOG);  /* 未经处理的连接请求队列可容纳的最大数目*/               
  if (res == -1) {
    perror("listen");
    exit(1);
  }

  /* 接受对方的连接请求, 建立连接,返回一个新的连接描述符.
   * 而第一个套接字描述符仍在你的机器上原来的端口 listen()
   */
  sin_size = sizeof(struct sockaddr_in);
  new_fd = accept(sockfd, (void *)&their_addr, &sin_size);

  buf = (char *)malloc(255);
  if (buf == NULL) {
    printf("malloc failed\n");
    exit(1);
  }

  /* 接受对方发来的数据*/
  res = recv(new_fd, buf, 255, 0);
  if (res == -1) {
    perror("recv()");
    exit(1);
  }

  /* 关闭本次连接*/
  close(new_fd);

  /* 关闭系统监听*/
  close(sockfd);

  printf("recv data:%s\n", buf);
  free(buf);
  return 0;
}

编译:
------------------------------------------------
gcc -o sockclnt sockclnt.c
gcc -o socksrv  socksrv.c




posted on 2008-08-02 16:03 Normandy 阅读(11161) 评论(5)  编辑 收藏 引用 所属分类: Networking

评论

# re: Linux 下 socket 编程示例  回复  更多评论   

呵呵,我在WINDOWS下也做过一个类似,不几乎是一模一样的SOCKET通讯,呵呵,看着代码怎么跟我的一样?哈哈,毕竟是按照TCP/IP协议写的嘛,难免有似曾相识的感觉,我的代码在 http://hi.baidu.com/alexeric.
2008-08-07 08:47 | AlexEric

# re: Linux 下 socket 编程示例  回复  更多评论   

@AlexEric
兄弟对 TCP/IP 也有兴趣啊,我打算通读 Linux 下的协议栈源码,有机会多切磋啊 :-)
2008-08-07 10:46 | Normandy

# re: Linux 下 socket 编程示例  回复  更多评论   

从纯技术的角度来讲,能够通读 Linux 下的协议栈源码对于Normandy 兄来说,是一件很享受的事情,但在俺看来,这东西也是求得工作立足之本的呀。
只不过俺现在不从事TCP/IP,看源码很累人。

Normandy 兄可以考虑开源,参与开源软件的开发,在开发中学习TCP/IP岂不更爽哉?
2008-08-07 11:35 | AlexEric

# re: Linux 下 socket 编程示例  回复  更多评论   

@AlexEric
看情况吧,只恐时间精力不够用。参与开源着重解决实际问题,分析 Kernel 源码则强调理解底层,我更喜欢看些底层的东西。

AlexEric 兄若有心得,一定要拿出来分享啊!
2008-08-07 12:22 | Normandy

# re: Linux 下 socket 编程示例  回复  更多评论   

其实,写远比看好。
所以兄台你要真要有所得,还是自己写代码吧,哪怕是模仿。
2008-08-07 21:02 | AlexEric

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理