linux下基於tcp的簡單的接收與發送程序,開發板與本機接收與發送信息

服務器

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <strings.h>
#include <errno.h>
#define BACKLOG 2

//#include <libxml/parser.h>

//#include <libxml/tree.h>
void process_conn_server(int s, char *ip);

int main(int argc, char *argv[])
{
 int ss,sc;
 struct sockaddr_in server_addr;
 struct sockaddr_in client_addr;
 int err;
 pid_t pid;
 //創建套接字
 
 ss=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 if (ss<0)
 {
  printf("socket error\n");
  return -1;
 }
 //設置服務器端口的地址
 //memset(&server_addr,0,sizeof(server_addr));
 server_addr.sin_family=AF_INET;
 server_addr.sin_port=htons(1000);
 server_addr.sin_addr.s_addr=INADDR_ANY;
 bzero(&(server_addr.sin_zero),8);
 //綁定套接字
 err = bind(ss,(struct sockaddr *)&server_addr,sizeof(server_addr));
 if (err<0)
 {
  printf("bind error\n");
  return -1;
 }
 
 
 
 //監聽套接字
 err=listen(ss,BACKLOG);
 
 
 
 if (err<0)
 {
  printf("listen error\n");
  return -1;
 }
 
 //主循環
 for (;;)
 {
  //int addrlen=sizeof(struct sockaddr);
  socklen_t addrlen=sizeof(struct sockaddr);
  sc=accept(ss,(struct sockaddr*)&client_addr,&addrlen);//如果調用成功,將返回一個新的套接字與客戶端通信
  printf("%s has connect success\n",inet_ntoa(client_addr.sin_addr));
  if (sc<0)
  {
   continue;
  }
  pid=fork();//創建一個進程與客戶端通信
  if (pid==0)
  {
   close(ss);
   process_conn_server(sc,inet_ntoa(client_addr.sin_addr));//調用子進程通信函數
   
  }
  if(pid!=0)
  {
   close(sc);
  }
  
 }
}

void process_conn_server(int s, char *ip)
{  
 char buffer[1024*512]; 
 while (1)
 {
   memset(buffer,0,sizeof(buffer));
   recv(s,buffer,1024*512,0);
   //if (strncmp("end",buffer,3)==0)
   //{
  printf("%s say :%s\n",ip,buffer);
    
    
  //統計客戶端輸出的字符個數併發給客戶端
    
    
  sprintf(buffer,"%d characters altogether",strlen(buffer)-1);
  send(s,buffer,1024*512,0);
 }
}
 

客戶端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <strings.h>
#include <errno.h>
#include <signal.h>
#define TEST


void process_conn_client(int s);
void signal_g();

int main()
{
 int s;
 struct sockaddr_in server_addr;
 int err;

 //創建套接字

 s=socket(AF_INET,SOCK_STREAM,0);
 if (s<0)
 {
  printf("socket error\n");
  return -1;
 }
 //設置服務器端口

 server_addr.sin_family=AF_INET;
 server_addr.sin_addr.s_addr=INADDR_ANY;
 server_addr.sin_port=htons(1000);
 bzero(&(server_addr.sin_zero),8);


 #ifndef TEST
 printf("a");
 #endif
 connect(s,(struct sockaddr *)&server_addr,sizeof(server_addr));
 #ifndef TEST
 printf("b");
 #endif

 process_conn_client(s);
 close(s);

}
void process_conn_client(int s)
{
 ssize_t size=0;
 char buffer[1024*512];
 //signal(SIGINT,signal_g);
 while (1)
 {
  memset(buffer,'\0',sizeof(buffer));
  fgets(buffer,1024*512,stdin);
  
  send(s,buffer,1024*512,0);
  
  memset(buffer,'\0',1024*512);
  recv(s,buffer,sizeof(buffer),0);
  printf("%s\n",buffer);
 }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章