socket服務器和客戶端代碼實作
服務器代碼:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include <linux/in.h>//與下一行沖突
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
int main()
{
//1.socket:獲取套接字
int s_fd;
s_fd=socket(AF_INET,SOCK_STREAM,0);
if(s_fd==-1)
{
perror("socket");
exit(-1);
}
//2.bind:系結IP地址和埠號
struct sockaddr_in s_addr;//在頭檔案#include <linux/in.h>當中定義的結構體
memset(&s_addr,0,sizeof(struct sockaddr_in));//清空
s_addr.sin_family=AF_INET;//系結ip地址
s_addr.sin_port=htons(8988);//5000-9000為埠號,埠號需要轉化為網路位元組序
//s_addr.sin_addr.s_addr=inet_aton("127.0.0.1");//IP地址結構體,并轉化,錯誤格式
inet_aton("172.20.10.3",&s_addr.sin_addr);//正確格式:對結構體取地址,再轉換
bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));
//3.listen:監聽是否有客戶端到來
listen(s_fd,10);//監聽10個
//4.accept:接受
int clen = sizeof(struct sockaddr_in);
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));//清空
int c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clen);//通過套接字接受客戶端,句柄換用c_fd
if(c_fd == -1)
{
perror("accept");
}
printf("get connext:%s\n",inet_ntoa(c_addr.sin_addr));
//5/read:讀取資料
char readbuf[128];
int n_read=read(c_fd,readbuf,128);
if(n_read == -1)
{
perror("read");
}else
{
printf("get message: %d,%s\n",n_read,readbuf);
}
//6.write:發送資料--- 回復
char *msg="i get your connext";
write(c_fd,msg,strlen(msg));
return 0;
}
實作服務器代碼之后,我們可以通過**windows平臺或者Linux平臺下的telnet客戶端** 來測驗服務器的地址埠是否導通
也可以通過客戶端代碼與服務器建立連接,
客戶端代碼:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include <linux/in.h>//與下一行沖突
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
int main()
{
//1.socket:獲取套接字
int c_fd;
c_fd=socket(AF_INET,SOCK_STREAM,0);
if(c_fd==-1)
{
perror("socket");
exit(-1);
}
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
c_addr.sin_family=AF_INET;
c_addr.sin_port = htons(8988);
inet_aton("172.20.10.3",&c_addr.sin_addr);
//2.connext:連接服務器
int cnt=connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr));//在連接的程序會阻塞在這里
if(cnt==-1)
{
perror("socket");
exit(-1);
}
//3.write:客戶端發送資料
char *msg = "msg from client\n";
write(c_fd,msg,strlen(msg));
//4.read:讀取資料
char readbuf[128];
int n_read=read(c_fd,readbuf,128);
if(n_read == -1)
{
perror("read");
}else
{
printf("get message from sever: %d,%s\n",n_read,readbuf);
}
return 0;
}
注1:在win10作業系統下有telnet客戶端,但沒有telnet服務器,需要下載,安裝并打開
需要進一步解決
注2:在linux平臺上,telnet出現連接超時的問題,也需要進一步解決,
注3:以上代碼在連接的時候存在小bug,有待修正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/45781.html
標籤:其他
