`
microjava
  • 浏览: 309376 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

socket网络编程基础

阅读更多
/*service.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 MYPORT 8888 //开放的端口号 1到1024是保留端口
#define BACKLOG 5   //指定套接字可以接受的最大客户机请求数目

int main(void)
{
  int sockfd,new_fd;
  struct sockaddr_in srvaddr;
  struct sockaddr_in cliaddr;
  int sin_size;

  //创建套接字描述符
  if((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1)
  {
    perror("socket error");
    exit(1);
  }
  bzero(&srvaddr,sizeof(srvaddr));
  //用自己的ip地址和端口信息填充一个internet套接字地址结构
  srvaddr.sin_family = AF_INET;
  srvaddr.sin_port = htons(MYPORT);
  
  //函数bind将服务器的地址和套接字绑定在一起
  if(bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr)) == -1)
  {
    perror("bind error");
    exit(1);
  }
  
  //listen函数告诉内核,这个套接字可以接受来自客户机的请求
  if(listen(sockfd,BACKLOG) == -1)
  {
    perror("listen error");
    exit(1);
  }

  //处理客户机的请求,使用函数accept来获得一个客户机的连接
  for(;;)
  {
    sin_size = sizeof(struct sockaddr_in);
    if((new_fd = accept(sockfd,(struct sockaddr *)&cliaddr,&sin_size)) == -1)
    {
      perror("accept error");
      continue;
    }
    printf("server:got connection from %s\n",inet_ntoa(cliaddr.sin_addr));
    //向客户端写数据
    if(write(new_fd,"Hello,Network!\n",14) == -1)
        perror("write error!");
    close(new_fd);
  }
  close(sockfd);
  return 0;
}


/*client.c*/
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>

#define PORT 8888
#define MAXDATASIZE 5000

int main(int argc,char **argv)
{
  int sockfd,nbytes;
  char buf[1024];
  struct hostent *he;
  struct sockaddr_in srvaddr;

  if(argc != 2)
  {
    perror("Usage:client hostname.\n");
    exit(1);
  }

  //函数gethostbyname获得指定域名地址所对应的ip地址
  if((he = gethostbyname(argv[1])) == NULL)
  {
    perror("gethostbyname");
    exit(1);
  }
  //创建套接字,返回套接字描述符
  if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
  {
    perror("create socket error");
    exit(1);
  }

  bzero(&srvaddr,sizeof(srvaddr));
  //用获得的远程服务器进程的ip地址和端口号来填充一个Internet套接字地址结构
  srvaddr.sin_family = AF_INET;
  srvaddr.sin_port = htons(PORT);
  srvaddr.sin_addr = *((struct in_addr *)he -> h_addr);

  //用connect于这个远程服务器建立一个internet连接
  if(connect(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr)) == -1)
  {
    perror("connect error");
    exit(1);
  }

  //调用read函数读取服务器write过来的信息
  if((nbytes = read(sockfd,buf,MAXDATASIZE)) == -1)
  {
    perror("read error");
    exit(1);
  }

  buf[nbytes] = '\0';
  printf("read:%s\n",buf);
  close(sockfd);
  return 0;
}


cc service.c -o service -lsocket
./service

cc client.c -o client -lsocket

./client 127.0.0.1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics