最近第一次学习了socket编程 本地进程间通信和利用局域网来通信都了解了一点 这次主要写的是通过局域网来通信
首先 服务器端代码
头文件:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//以上三个为标准c语言函数,这里不多加赘述
#include<unistd.h>//linux c编程时用库函数要加的头文件 类比于windows.h 可以使用Unix操作系统库里的东西
#include<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>
#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);
}