網路程式設計中簡單的點對點聊天程式

2021-07-25 11:24:34 字數 3338 閱讀 5313

利用多程序實現,乙個程序負責傳送,乙個程序負責接收!畢竟檔案描述符共享(實際上是兩個程序空間中不相關的檔案描述符指向同乙個檔案)

伺服器端**:

/*server03*/

#include /* see notes */

#include

#include

#include /* superset of previous */

#include

#include

#include

#include

#include

#include

#define max_client 10

#define max_read 1024

void handle(int sig)//輔助殺死子程序或者父程序

int main()

;//儲存客戶端ip位址

char buf[max_read]=;//應用程式自己的緩衝區

int optvar;//位址復用使用的引數

pid_t pid;//子程序pid

socklen_t addr_len;

ssize_t ret ;

signal(sigusr1,handle);//註冊新號和處理函式

serv_fd = socket(af_inet,sock_stream,0);//建立套接字

if(-1 == serv_fd)

if(setsockopt(serv_fd, sol_socket,so_reuseaddr,&optvar,sizeof(optvar)) == -1 )//位址復用

/*設定位址*/

bzero(&serv_addr,sizeof(serv_addr));

serv_addr.sin_family = af_inet;

serv_addr.sin_port = htons(8001);

serv_addr.sin_addr.s_addr = htons(inaddr_any);

if(bind(serv_fd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) == -1)//繫結埠

/*一旦呼叫listen函式--套接字就會變成被動套接字--用來監聽客戶端,讓客戶端連線他

被動套接字--只能接受連線,不能主動傳送連線

做了兩個佇列:

乙個已經完成三次握手,建立連線的佇列--客戶端發connect請求被響應,已經成功完成連線

乙個是未完成成三次握手的佇列--正在握手

*/if(listen(serv_fd,max_client)== -1)//開始監聽

addr_len = sizeof(clt_addr);

printf("accepting connections ...\n");

if((con_fd = accept(serv_fd,(struct sockaddr *)&clt_addr,&addr_len)) == -1)//由於是點對點--所以只能處理乙個客戶端的連線請求

printf("received from %s at port %d\n",inet_ntop(af_inet,&clt_addr.sin_addr,addr_dst,sizeof(addr_dst)),ntohs(clt_addr.sin_port));

pid = fork();//建立子程序

if(pid > 0)//父程序負責讀取客戶端資料

else

if(ret < 0)

fputs(buf,stdout);//列印內容

memset(buf,0,sizeof(buf));

}close(serv_fd);//關閉套接字

close(con_fd);

kill(pid,sigusr1);//傳送訊號給子程序--通知他死期已到

} else

if(pid == 0)//子程序負責向客戶端寫入資料

}else

if(pid == -1)//建立子程序錯誤

return

0;}

客戶端**

#include /* see notes */

#include

#include

#include /* superset of previous */

#include

#include

#include

#include

#include

#include

#define max_buf 1024

void handle(int sig)

int main()

; char addr_dst[inet_addrstrlen] = ;

ssize_t ret;

pid_t pid;

signal(sigusr1,handle);

clt_fd = socket(af_inet,sock_stream,0);

if(-1 == clt_fd)

serv_addr.sin_family = af_inet;

serv_addr.sin_port = htons(8001);

serv_addr.sin_addr.s_addr = inet_addr("192.168.1.110");

if(connect(clt_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1)

printf("connect successfully\t%s at port %d\n",inet_ntop(af_inet,&serv_addr.sin_addr,addr_dst,sizeof(addr_dst)),ntohs(serv_addr.sin_port));

pid = fork();

if(pid > 0)//父程序負責給伺服器端傳送資料

}else

if(pid == 0)//子程序負責從伺服器端獲取資料

else

if(ret < 0)

fputs(buf,stdout);//列印內容

memset(buf,0,sizeof(buf));

}close(clt_fd);

kill(getppid(),sigusr1);//傳送訊號給父程序--通知他死期已到

} else

if(pid == -1)//建立子程序錯誤

return

0;}

socket程式設計之點對點聊天程式

p2psrv.c include include include include include include 解決父程序退出,子程序不退出 include include include include define err exit m do while 0 void handler int ...

簡單的網路聊天程式,MFC實現

casyncsocket 類是mfc 對windows socket 的基本封裝,而 csocket 類是更深層次的封裝,csocket 類派生與 casyncsocket 類。csocket 類提供了方便的套接字的程式設計,而 casyncsocket 類提供了更加靈活的套接字的程式設計。casy...

Socket網路程式設計 聊天程式 8

上一節已經完成了對使用者的身份驗證了,既然有了驗證,那麼接下來就能對不同的客戶端進行區分了,所以這一節講實現私聊功能。就是通過伺服器對客戶端的資料進行 到特定的使用者上,實現私聊功能的聊天程式 實現的技術細節是 對客戶端傳送的資料增加乙個標識頭,由於我們處理的是純文字,所以為了講解的方便就把標識頭加...