最近第一次學習了socket編程 本地進程間通信和利用局域網來通信都了解了一點 這次主要寫的是通過局域網來通信
首先 服務器端代碼
頭文件:
#include<stdio.h>
#include<stdlib.h>
#inlcude<string.h>//以上三個為標准c語言函數,這裡不多加贅述
#include<unistd.h>//linux c編程時用庫函數要加的頭文件 類比於windows.h 可以使用Unix操作系統庫裡的東西
#inlcude<sys/types.h>//包含編程時需要用到的一些數據類型
#include<sys/socket.h>//socket編程時要用的頭文件
#include<sys/un.h>//Internet 協議族
#include<arpa/inet.h>//包含ip地址由本地字序轉換到網絡字序(大端?)時要用到的函數
定義變量:
int server_fd,client_fd;//通信用的套接字
struct sockaddr_in myaddr;//socket編程時 若是局域網通信 用到的一種結構體
struct sockaddr_in client_addr;
myaddr.sin_family=AF_INET;//結構體中包含的內容之一 所用的通信協議
myaddr.sin_addr.s_addr=htonl(INADDR_ANY);之二 允許連接的ip INADDR_ANY表示允許任意ip地址連接
myaddr.sin_port=htons(8080);//之三 使用的端口號
int clientlen=sizeof(client_addr);
以下是創建連接的過程
//1.socket
server_fd=socket(AF_INET,SOCK_STREAM,0);
if(server_fd==-1)
{
perror("socket error");
exit(-1);
}
//2.bind
if((bind(server_fd,(struct sockaddr *)&myaddr,sizeof(myaddr)))==-1)
{
perror("bind error");
exit(-1);
}
//3.listen
if(listen(server_fd,5)==-1)
{
perror("listen error");
exit(-1);
}
printf("listening...\n");
//4.accept
client_fd=accept(server_fd,(struct sockaddr *)&client_addr,&clientlen);//創建一個新的套接字 原來那個仍用於監聽端口 這個用於發送接收消息
if(client_fd==-1)
{
perror("accept error");
exit(-1);
}
//5.op
send(client_fd,"hi i'm kid",11,0);
printf("write to client\n");
//6.close
close(server_fd);
close(client_fd);
}
客戶端代碼
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int main()
{
int server_fd;
struct sockaddr_in myaddr;
myaddr.sin_family=AF_INET;
myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");//將點制ip轉化成32位長整形整數
myaddr.port=htonl(8080);
char buf[100];
server_fd=socket(AF_INET,SOCK_STREAM,0);
if(server_fd==-1)
{
perror("socket error");
exit(-1);
}
if((connect(server_fd,(struct sockaddr *)&myaddr,sizeof(myaddr)))==-1)
{
perror("connect error");
exit(-1);
}
recv(server_fd,buf,100,0);
printf("%s\n",buf);
close(server_fd);
}