基於SOCKET簡單通訊程式

2021-05-01 02:18:05 字數 4314 閱讀 7828

主要功能:利用c/s模式,可以多台客服機於主機通訊。

標頭檔案:

#ifndef __head_h__

#define __head_h__

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

/*  伺服器要監聽的本地埠 */

#define myport 4000

/*  能夠同時接受多少沒有 accept 的連線 */

#define backlog 10

// pthread_mutex_t work_mutex; /* protects both work_area and time_to_exit */

#define maxdatasize 1024

extern char work_area[maxdatasize];

typedef struct lk lk;

typedef struct ser_list ser_list;

struct lk;

struct ser_list ;

typedef struct list_header list_header;

extern list_header freeheader;

extern list_header usedheader;

extern void initfreelist(list_header *header);

extern void initusedlist(list_header *used_header);

extern ser_list* findblock(list_header *free_header,list_header *used_header);

extern void reclaim(list_header* free_header,list_header* used_header,ser_list* p);

#endif

list.c

#include "head.h"

char work_area[maxdatasize];

list_header freeheader;

list_header usedheader;

void initheader(list_header *header)

void insertlist(list_header *header)

void initfreelist(list_header *free_header)

/*將節點a 插入末尾*/

void addlist(list_header *header,lk *p)

ser_list* findblock(list_header *free_header,list_header *used_header)

if((p = deletelist(free_header))==null)

addlist(used_header,(lk *)p);

return p;

}void  deletlistk(list_header* header,ser_list*p)

if(pp==null) ;

temp->next = pp->next;

header->len--;

}void reset(ser_list* p)

/* 從已用鍊錶中摘除至空鍊錶*/

void reclaim(list_header* free_header,list_header* used_header,ser_list* p)

server.c

#include "head.h"

void *server_function(void *arg) ;

void *s_function(void *arg);

void sendfunction(int *p);

ssize_t package_recv(int s ,void *buf,size_t len,int flags)

else if(nread == 0)

break;

nleft -= nread;

ptr += nread;

}return len-nleft;

ssize_t package_send(int s,const void *buf,size_t len,int flags)

else if(nread == 0)

break;

nleft -= nread;

ptr += nread;

}return len-nleft;

}int time_to_exit = 0;

int main(int argc, char *argv)

/*  主機位元組順序 */

my_addr.sin_family = af_inet;

/*  網路位元組順序,短整型 */

my_addr.sin_port = htons(myport);

/*  將執行程式機器的ip填充入s_addr */

my_addr.sin_addr.s_addr = inaddr_any;

/*  將此結構的其餘空間清零 */

bzero(&(my_addr.sin_zero), 8);

/*  這裡是我們一直強調的錯誤檢查!! */

if (bind(sock_fd, (struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1)

/*  這裡是我們一直強調的錯誤檢查!! */

if (listen(sock_fd, backlog) == -1)

res = pthread_create(&s_thread, null, s_function, null);

while(1)

p->used_flag = 1;

/*  伺服器給出出現連線的資訊 */

printf(" server: got connection from %s/n" , inet_ntoa(their_addr.sin_addr));

/*  這裡將建立乙個子程序來和剛剛建立的套接字進行通訊 */

res = pthread_create(&(p->pthread), null, server_function, (void*)p);  

if (res != 0)  

}res = pthread_join(s_thread, s_result);

if(res != 0)

printf("all send thread joined/n");

/*  等待所有的子程序都退出 */

p_temp = usedheader.next;

doprintf("thread joined/n");

}while(p_temp != null);

return 0;

}/*執行緒服務函式*/

void *server_function(void *arg)

buf[numbytes] = '/0';

if(buf[0]=='/0')  

printf("recive:%s/n",buf);

if((buf[0] == 'q' ||buf[0]=='q') &&( buf[1] == '/0'))  break;

} /*  關閉new_fd 代表的這個套接字連線 */

close(new_fd );

reclaim(&freeheader,&usedheader,(ser_list*)arg); 

pthread_exit(0);

}void *s_function(void *arg)

while((p = usedheader.next) == null);

doif(p == null) break;

send_fd = ((ser_list*)(p))->new_fd;   

printf("new_fd:%d/n",send_fd);  

if ((numbytes = package_send(send_fd,buf,strlen(buf),0)) == -1)

if((buf[0] == 'q' ||buf[0]=='q') &&( buf[1] == '/0'))  break;   

p=p->next;

}while(p != null);}}

基於tornado的簡單socket通訊建立

這裡有比較全的介紹,寫得非常好。顯示效果如下 如下 import errno import functools from tornado ioloop import ioloop import socket import time import queue sock socket socket so...

簡單Socket通訊

示例程式是同步套接字程式,功能很簡單,只是客戶端發給伺服器一條資訊,伺服器向客戶端返回一條資訊 這裡只是乙個簡單的示例,是乙個最基本的socket程式設計流程,在接下來的文章中,會依次記錄套接字的同步和非同步,以及它們的區別。下面是示例程式的簡單步驟說明 伺服器端 第一步 用指定的埠號和伺服器的ip...

socket 簡單通訊

服務端 1.建立乙個服務端 import socket phone socket.socket 括號內不輸入,預設為family addressfamily.af inet type socketkind.sock stream proto 0 2.為服務端建立ip位址及埠號 phone.bind ...