fff目录
1.Linux
代码
服务端 :
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main(int argc,char*argv[])
{
int sock_ser,sock_cli;
struct sockaddr_in addr_ser,addr_cli;
socklen_t len;
int blk = 3;
char buffer[] = "hello world";
//参数个数不对直接退出
if(argc != 3)
{
printf("error %s: 参数错误\n",argv[1]);
exit(1);
}
//初始化ip,port
memset(&addr_ser,0,sizeof(addr_ser));
addr_ser.sin_family = AF_INET;
addr_ser.sin_port = htons(atoi(argv[2]));
addr_ser.sin_addr.s_addr = inet_addr(argv[1]);
//建立监听套接字
sock_ser = socket(AF_INET,SOCK_STREAM,0);
if(sock_ser == -1)
{
printf("error:%s 监听套接字建立失败",argv[0]);
exit(1);
}
//套接字绑定ip,port
if(bind(sock_ser,(struct sockaddr*)&addr_ser,sizeof(addr_ser)) == -1)
{
printf("error:%s 监听套接字绑定失败",argv[0]);
exit(1);
}
//监听客户端连接
if(listen(sock_ser,blk) == -1)
{
printf("error:%s 监听套接字监听失败",argv[0]);
exit(1);
}
//接受客户端连接
sock_cli = accept(sock_ser,(struct sockaddr*)&addr_ser,&len);
if(sock_cli < 0)
{
printf("error:%s 接受客户端失败",argv[0]);
exit(1);
}
//型客户端发送hello world
write(sock_cli,buffer,sizeof(buffer));
//关闭套接字
close(sock_cli);
close(sock_ser);
return 0;
}
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main(int argc,char*argv[])
{
int sock_cli;
struct sockaddr_in addr_ser;
char buffer[30];
//参数个数不对直接退出
if(argc != 3)
{
printf("error %s: 参数错误\n",argv[1]);
exit(1);
}
//初始化ip,port
memset(&addr_ser,0,sizeof(addr_ser));
addr_ser.sin_family = AF_INET;
addr_ser.sin_port = htons(atoi(argv[2]));
addr_ser.sin_addr.s_addr = inet_addr(argv[1]);
//建立套接字
sock_cli = socket(AF_INET,SOCK_STREAM,0);
if(sock_cli == -1)
{
printf("error:%s 套接字建立失败",argv[0]);
exit(1);
}
//连接服务器
if(connect(sock_cli,(struct sockaddr*)&addr_ser,sizeof(addr_ser)) == -1)
{
printf("error:%s 建立连接失败",argv[0]);
exit(1);
}
//型客户端发送hello world
read(sock_cli,buffer,sizeof(buffer));
printf("%s",buffer);
//关闭套接字
close(sock_cli);
return 0;
}
头文件
sys/socket.h
socket()
bind()
listen()
connect()
accept()
unistd.h
read()
write()
string.h
memset()
atoi()
arpa/inet.h
ip地址的字符串转换inet_addr(char * ip)
inet_aton(char *ip,struct in_addr* addr)
inet_ntoa(struct in_addr*addr),不可重入
函数
//协议族、套接字类型、协议 int socket(int domain,int type,int protocol) //套接字、包含地址端口的结构体、第二个参数的字节数 int bind(int sock,struct sockaddr* s,size_t len) //套接字。等待连接队列长度 int listen(int socket,int blacklog) //与bind类型,返回与客户端连接的套接字 int accept(int socket,struct sockaddr* s,socklen_t * len) //类似 int connect(int socket,struct sockaddr* s,size_t len) write() read() close()
失败时都返回-1
结构体
struct sockaddr
struct sockaddr_in
Window
代码
服务端:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main(int argc,char*argv[])
{
int sock_cli;
struct sockaddr_in addr_ser;
char buffer[30];
//参数个数不对直接退出
if(argc != 3)
{
printf("error %s: 参数错误\n",argv[1]);
exit(1);
}
//初始化ip,port
memset(&addr_ser,0,sizeof(addr_ser));
addr_ser.sin_family = AF_INET;
addr_ser.sin_port = htons(atoi(argv[2]));
addr_ser.sin_addr.s_addr = inet_addr(argv[1]);
//建立套接字
sock_cli = socket(AF_INET,SOCK_STREAM,0);
if(sock_cli == -1)
{
printf("error:%s 套接字建立失败",argv[0]);
exit(1);
}
//连接服务器
if(connect(sock_cli,(struct sockaddr*)&addr_ser,sizeof(addr_ser)) == -1)
{
printf("error:%s 建立连接失败",argv[0]);
exit(1);
}
//型客户端发送hello world
read(sock_cli,buffer,sizeof(buffer));
printf("%s",buffer);
//关闭套接字
close(sock_cli);
return 0;
}
客户端:
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
int main(int argc,char *argv[])
{
SOCKET sock;
WSADATA wsadata;
SOCKADDR_IN addr_ser,addr_cli;
char buffer[30];
int len = sizeof(addr_cli);
if(argc != 3)
{
printf("参数错误");
exit(1);
}
//设置winsock版本并初始化相应库
if(WSAStartup(MAKEWORD(2,2),&wsadata) != 0)
{
printf("WSAStartup error\n");
exit(2);
}
//初始化ip,prot
memset(&addr_ser,0,sizeof(addr_ser));
addr_ser.sin_family = AF_INET;
addr_ser.sin_port = htons(atoi(argv[2]));
addr_ser.sin_addr.s_addr = inet_addr(argv[1]);
//建立套接字
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sock == INVALID_SOCKET)
{
printf("套接字建立错误");
exit(1);
}
//发起连接
if(connect(sock,(SOCKADDR*)&addr_ser,sizeof(addr_ser)) == SOCKET_ERROR)
{
perror("因为");
exit(1);
}
recv(sock,buffer,sizeof(buffer),0);
printf("recv %s",buffer);
closesocket(sock);
WSACleanup();
return 0;
}
头文件和库
winsock32.h
-lwsock32 库
函数
//初始化winsock版本和相应库
WSAStartup(MAKEMODE(2,2),WSADATA * wsadata)
WSACleanup()
SOCKET socket(int demain,int type,int protocol)
int bind(SOCKET sock,struct sockaddr* s,size_t len)
int listen(SOCKET socket,int blacklog)
SOCKET accept(int socket,struct sockaddr* s,socklen_t * len)
int connect(SOCKET socket,struct sockaddr* s,size_t len)
类型
SOCKET 结构体
INVALID_SOCKET //建立套接字时使用 ,其值等于-1
SOCKET_ERROR
SOCKETADDR_IN
recv()
send()
Linux和window的差别总结
1.linux下一切皆文件,所以可以对套接字使用read(),write(),window区分文件和套接字,所以不能使用
2.window需要WSAStartup(),WSACleanup(),closesock(),其他函数基本相同,只不过Window对类型使用了typedef
3.SOCKADDR_IN,SOCKET,
4.错误判断,INVALID_SOCKET,SOCKET_ERROR(-1)