主要功能:利用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 ...