Socket通讯

   这是一个同学做的。放在这里供以后参考。

##############################

server.c

##############################

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
/**
 *title: 似乎是之前的上机练习
 *Author:Eric Jia
 *desc: 网络编程似乎是要发送一段消息给另一方接收,互相聊天
 *add: 这是客户端,运行是需要先运行服务端,然后再运行客户端。客户端运行时候请把服务器ip作为参数加入。
 * 比如本机通讯的话,再运行了服务端之后,运行客户端: ./client 127.0.0.1
 * 然后客户端和服务端就可以聊high了。。
 */
#define SEND_MAX 256
#define PORT 7227
#define MAX_CONNECTION 10

 

void err_exit(char* msg){
 printf("%s",msg);
 exit(1);
 return;
}

void err(char* msg){
 printf("%s",msg);
 return ;
}

void recv_try(int sockfd){
 int n;
 char buf[SEND_MAX];
 while((n=recv(sockfd, buf, SEND_MAX, 0))>0){
  printf("**Others Said:**\r\n");  
  printf("%s\r\n", buf);
  printf("******\n\n"); 
 }
 if(n<0)
  printf("**Recive Error**\n");
 else
  printf("**Seems Client Has Disconnected Connection**\n");
}

int main(int argc, char* argv[]){
 int  sock;
 struct sockaddr_in sin;
 
  if((sock=socket(AF_INET, SOCK_STREAM, 0))<0){
  err_exit("**Seems a Error Caused In Getting a Socket :( **\n");
 }
 sin.sin_family = AF_INET;
 sin.sin_addr.s_addr= inet_addr("127.0.0.1");
 sin.sin_port = PORT;
 if(bind(sock,(struct sockaddr*)&sin,sizeof(sin)))
  err_exit("Err Bind\n");
 else if(listen(sock,MAX_CONNECTION))
  err_exit("ERR Listen\n");
 struct sockaddr_in client;
 int sin_size=sizeof(client);
 int new_sock = accept(sock, (struct sockaddr* )&client, (socklen_t* )&sin_size);
 
 pid_t pid;
 if((pid=fork())<0)
  err_exit("Fork Error\n");
 else if(pid==0){
  recv_try(new_sock);
 }else{
  while(1){
   char buf[SEND_MAX];
   memset(buf,0,SEND_MAX);
   gets(buf);
   if(!strcmp(buf,"::cmd_exit")){
    close(new_sock);   
    break;
   }
   write(new_sock,buf,SEND_MAX);
   printf("\n");
  }
 }
  
 return 0; 
}

#########################

client.c

########################

 

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
/**
 *title: 似乎是之前的上机练习
 *Author:Eric Jia
 *desc: 网络编程似乎是要发送一段消息给另一方接收,互相聊天
 *add: 这是客户端,运行是需要先运行服务端,然后再运行客户端。客户端运行时候请把服务器ip作为参数加入。
 * 比如本机通讯的话,再运行了服务端之后,运行客户端: ./client 127.0.0.1
 * 然后客户端和服务端就可以聊high了。。
 */
#define SEND_MAX 256
#define PORT 7227

void recv_try(int sockfd){
 int n;
 char buf[SEND_MAX];
 while((n=recv(sockfd, buf, SEND_MAX, 0))>0){
  printf("**Others Said:**\r\n");  
  printf("%s\r\n", buf);
  printf("******\n\n"); 
 }
 if(n<0)
  printf("**Recive Error**\n");
 else
  printf("**Seems Server Has Disconnected Connection**\n");
}

void err_exit(char* msg){
 printf("%s",msg);
 exit(1);
 return;
}

void err(char* msg){
 printf("%s",msg);
 return ;
}

int main(int argc, char* argv[]){
 int  sock;
 struct sockaddr_in sin;
 
 if(argc!=2){
  err_exit("usage: [ProgramName] [HostIP]\r\n"); 
 }else if((sock=socket(AF_INET, SOCK_STREAM, 0))<0){
  err_exit("**Seems a Error Caused In Getting a Socket :( **\r\n");
 }
 sin.sin_family = AF_INET;
 sin.sin_addr.s_addr= inet_addr(argv[1]);
 sin.sin_port = PORT;
 
 if(connect(sock, (struct sockaddr*)&sin, sizeof(sin))<0) {
  err_exit("**Seems the Server is Not Ready :( **\r\n");
 }else{
  printf("**Successful Connected! ;D**\n\n");
 }
 pid_t pid;
 if((pid=fork())<0)
  err_exit("Fork Error\r\n");
 else if(pid==0){
  recv_try(sock);
 }else{
  while(1){
   char buf[SEND_MAX];
   memset(buf,0,SEND_MAX);
   gets(buf);
   if(!strcmp(buf,"::cmd_exit")){
    close(sock);   
    break;
   }
   write(sock,buf,SEND_MAX);
   printf("\n");
  }
 }
 return 0; 
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值