网络编程概念全面接触(三)

草木瓜

写文章真累,写好文章更是很累,怪不得大家都喜欢贴来贴去,或者稍加修改罢了。
网络编程这块是老生常谈,个人觉得《Beej网络socket编程指南》算是经典了。网上
一搜一大堆,这里也顺应大流,不写了,贴一下。

下面给出一个网络交互的完整示例,在HP UNIX编译调试通过!对照以前的网络概念,
还有经典的文章就应该很清楚了。


server.c
-----------------------------------------------------


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>

#define PORT 16666  /*定义用户连接端口*/
#define BACKLOG 1 /*多少等待连接控制*/
int main()
{
 int listen_fd;      /* listen_fd 监听返回的文件描述符 */
 int newconn_fd;     /* newconn_fd 新连接返回的文件描述符 */
 struct sockaddr_in serv_addr;   /* 服务器的地址信息 */
 struct sockaddr_in client_addr; /* 请求连接客户端的地址信息 */
 int sin_size;
 
 if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
 {
  perror("socket");
  exit(1);
 }

 serv_addr.sin_family = AF_INET;         /* host byte order */
 serv_addr.sin_port = htons(PORT);       /* 转变为网络字节顺序 */
 serv_addr.sin_addr.s_addr = INADDR_ANY; /* 本地IP地址 */
 bzero(&(serv_addr.sin_zero),sizeof(serv_addr.sin_zero)); /* 清空数据空间 */

  if (bind(listen_fd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr))== -1)
  {
  perror("bind");
  exit(1);
 }
 
 if (listen(listen_fd, BACKLOG) == -1)
 {
  perror("listen");
  exit(1);
 }

 while(1)
 { /* 主循环 accept() */
  sin_size = sizeof(struct sockaddr_in);
  if ((newconn_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &sin_size)) == -1)
  {
   perror("accept");
   continue;
  }
  printf("server: got connection from %s/n", inet_ntoa(client_addr.sin_addr));
  if (!fork())
  { /* 子进程 */
   if (send(newconn_fd, "You connected the server!/n", 26, 0) == -1) perror("send error");
   close(newconn_fd);
   exit(0);
  }
  close(newconn_fd); /* 父进程不需要 */
  while(waitpid(-1,NULL,WNOHANG) > 0);/* 清除子进程 */
 }
}


client.c
-----------------------------------------------------


#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/wait.h>
//#include <winsock.h>
#define PORT 16666       /* 客户机连接远程主机的端口 */
#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */
int main(int argc, char *argv[])
{
 int sock_fd, numbytes;
 char buf[MAXDATASIZE];
 struct sockaddr_in serv_addr; /* 连接服务器的地址 */
 unsigned long ip_addr;

 if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
 {
  perror("socket");
  exit(1);
 }

 serv_addr.sin_family = AF_INET;
 serv_addr.sin_port = htons(PORT);
 ip_addr = inet_addr("132.240.9.12");
 
 if(ip_addr==-1)
 {
  perror("Address Convert Error");
  exit(1);
 }
 
 serv_addr.sin_addr.s_addr = ip_addr;
 bzero(&(serv_addr.sin_zero),sizeof(serv_addr.sin_zero));

 if (connect(sock_fd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1)
 {
  perror("connect");
  exit(1);
 }
 if ((numbytes=recv(sock_fd, buf, MAXDATASIZE, 0)) == -1)
 {
  printf("recv");
  exit(1);
 }
 buf[numbytes] = '/0';
 printf("Received: %s /n",buf);
 close(sock_fd);
 return 0;
}
 

你可能感兴趣的:(编程,server,网络,Stream,struct,socket)