网站制作学习网Linux→正文:C socket 通信服务端端
字体:

C socket 通信服务端端

Linux 2012/9/18 18:31:51  点击:不统计

http://%77w%77%2E%66%6F%72%61%73%70%2E%63n网站制作学习

根据网上的改了改,写了个简单的socket通信,具有相当大的bug,是需要在修改的。
基本实现是从客户端链接,然后发送数据,服务器接收数据并返回发送的内容。
这里的服务器端,有一个很大的bug(也不算),是每个clint都有一个新的process,嘿嘿,需要修改滴#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "string_q.h"
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 3333
#define BACKLOG 10
#define MAXSIZE 1024


int main(){
  int sockfd,client_fd,rr,i,flag;
  struct sockaddr_in my_addr;
  struct sockaddr_in remote_addr;
  char* msg;
  struct name_list name_l[10];
  rr = 0;
  int rval;
  char buf[MAXSIZE];
 //create socket
  if((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1){
      perror("socket creat failed!");
      exit(1);
  }
 //bind port
 my_addr.sin_family = AF_INET;
 my_addr.sin_port   = htons(SERVPORT);
 my_addr.sin_addr.s_addr = INADDR_ANY;
 bzero(&(my_addr.sin_zero),8);
 if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))== -1){
   perror("bind error!1");
   exit(1);
 }
 //keep listen
 if(listen(sockfd,BACKLOG) == -1){
   perror("listen error");
   exit(1);
  }
 //get all apply connect,is a endless loop
while(1){
   int sin_size = sizeof(struct sockaddr_in);
   client_fd = accept(sockfd,(struct sockaddr *)&remote_addr,&sin_size);
   if(client_fd == -1){
    perror("accept error!");
    continue;
  }
 //printf("Receivd a connection from %s\n",(char*)inet_ntoa(remote_addr.sin_addr));
 //child precess
 if(!fork()){
   //accept client send message
cc:
   memset(buf,'\0',MAXSIZE); 
   if((rval = read(client_fd,buf,MAXSIZE))<0){
    perror("read stream error!");
    goto cc;
   }
   //printf("%s\n",buf);
   // name_l[rr++].name = buf;
   if(buf[0]=='1'){//send message
     for(i=0;i<10;++i){
    if(strncmp((buf+1),name_l[i].name,4)==0){
      client_fd = name_l[i].fd;
   break;
    }
  }
  buf[5] ='0';
     msg = buf + 5;
   }else{// a new clint
     flag = 0 ;
     for(i=0;i<10;++i){
    if(strncmp((void *)(buf+1),name_l[i].name,4)==0){
      flag = 1;
   break;
    }
  }
  if (flag){
   msg = "1You's name was used!";
  }else{
         strncpy(name_l[rr].name,(buf+1),4);
         name_l[rr++].fd  = client_fd;
   msg = "0Wellcome!";
  }
   
   }   
   //char* msg = "Hello world!";
   if(send(client_fd,msg,strlen(msg),0)== -1){
    perror("send error");
    close(client_fd);
    exit(0);
   }
   goto cc;
   close(client_fd);
 }
 //return 0;
  continue;
 }
 return 0;
}

 


http://%77%77%77%2E%66网站制作%6F学习网%72%61%73%70%2E%63%6E

·上一篇:C socket 通信客户端 >>    ·下一篇:httpd_load并发顺序访问url >>
推荐文章
最新文章