网络编程一 ----linux,window的简单网络通信实现

fff目录

1.Linux

        代码

        头文件

         函数

结构体

Window

 代码

头文件和库

函数

 类型             

Linux和window的差别总结


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)

        

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值