Socket编程学习:使用C语言进行Socket编程

本文介绍了如何使用C语言进行TCP Socket编程,包括服务端和客户端的编程步骤,涉及加载套接字库、创建套接字、绑定、监听、接受连接、通信以及关闭套接字等关键操作。通过具体的实例展示了服务端等待客户端连接并接收信息,以及客户端发起连接并发送信息的过程。
摘要由CSDN通过智能技术生成

sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW)。

基于TCP的socket编程是采用的流式套接字。

服务端编程步骤

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:将套接字设置为监听模式等待连接请求(listen());

4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5:用返回的套接字和客户端进行通信(send()/recv());

6:返回,等待另一连接请求;

7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

客户端编程步骤

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:向服务器发出连接请求(connect());

3:和服务器端进行通信(send()/recv());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

具体操作

1、 加载/释放Winsock库

1)加载方法:

WSADATA wsa;//初始化socket资源
if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)
{
   
    return;   //代表失败
}

2)释放方法:

WSACleanup();

2、构造SOCKET

1)服务端:构造监听SOCKET,流式SOCKET

 SOCKET Listen_Sock = socket(AF_INET, SOCK_STREAM, 0);

2)客户端:构造通讯SOCKET,流式SOCKET

SOCKET Client_Sock = socket(AF_INET, SOCK_STREAM, 0);

3、服务端配置监听地址和端口:

SOCKADDR_IN serverAddr
ZeroMemory((char *)&serverAddr,sizeof(serverAddr));
   serverAddr.sin_family = AF_INET;
   serverAddr.sin_port = htons(1234);           //本地监听端口:1234

4、服务端绑定监听SOCKET

 bind(Listen_Sock,(struct sockaddr *)&serverAddr,sizeof(serverAddr));

5、服务端/客户端连接

1)服务端:等待客户端接入

SOCKET Command_Sock = accept(Listen_Sock, ...);

2)客户端:请求与服务端连接

int ret = connect(Client_Sock, ...);

6、收/发数据

1)服务端:等待客户端接入.

char buf[1024];

    接收数据:recv(Command_Sock,buf, ...);
或
    发送数据:send(Command_Sock,buf, ...);

2)客户端:请求与服务端连接

char buf[1024];
    发送数据:
最新版Socket编程,后面带有程序实例,并通过调试,可以直接编译运行;希望对大家有帮助。代码设计服务端、客户端socket实例,设计IPV4、IPV6的实例代码。 网络Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 部分代码(服务器): #include #include #include #include #include #include #include #include #define SERVPORT 3333 /*服务器监听端口号 */ #define BACKLOG 10 /* 最大同时连接请求数 */ main() { int sockfd,client_fd; /*sockfd:监听socket;client_fd:数据传输socket */ struct sockaddr_in my_addr; /* 本机地址信息 */ struct sockaddr_in remote_addr; /* 客户端地址信息 */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror( "socket创建出错!"); exit(1); } my_addr.sin_family=AF_INET; my_addr.sin_port=htons(SERVPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero( &(my_addr.sin_zero),8); if (bind(sockfd, (struct sockaddr *) &my;_addr, sizeof(struct sockaddr)) == -1) { perror( "bind出错!"); exit(1); } if (listen(sockfd, BACKLOG) == -1) { perror( "listen出错!"); exit(1); } while(1) { sin_size = sizeof(struct sockaddr_in); if ((client_fd = accept(sockfd, (struct sockaddr *) &remote;_addr, &sin;_size)) == -1) { perror( "accept出错"); continue; } printf( "received a connection from %s\n", inet_ntoa(remote_addr.sin_addr)); if (!fork()) { /* 子进程代码段 */ if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1) perror( "send出错!"); close(client_fd); exit(0); } close(client_fd); } } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值