利用多程序實現,乙個程序負責傳送,乙個程序負責接收!畢竟檔案描述符共享(實際上是兩個程序空間中不相關的檔案描述符指向同乙個檔案)
伺服器端**:
/*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
上一節已經完成了對使用者的身份驗證了,既然有了驗證,那麼接下來就能對不同的客戶端進行區分了,所以這一節講實現私聊功能。就是通過伺服器對客戶端的資料進行 到特定的使用者上,實現私聊功能的聊天程式 實現的技術細節是 對客戶端傳送的資料增加乙個標識頭,由於我們處理的是純文字,所以為了講解的方便就把標識頭加...