socket通信过程
1. 服务端创建socket (socket函数)
2. 服务端绑定端口 (bind函数)
3. 服务端监听端口 (listen函数)
4. 客户端向服务端请求连接 (connect函数)
5. 服务端接受连接请求 (accept函数)
6. 客户端和服务端通过读写socket通信 (recv/send函数)
头文件
windows
winsock2.h 定义socket及数据结构头文件`
linux
sys/types.h //提供数据定义
sys/socket.h //提供socket函数及数据结构
netinet/in.h // 定义数据结构socketaddr_in
arpa/inet.h //定义inet_addr函数
unistd //定义close函数
阻塞式socket
服务器端
#ifndef __WIN32
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#else
#include <winsock2.h>
typedef int socklen_t
#pragma comment(lib, "ws2_32.lib")
#endif
#include <string.h>
#include <stdio.h>
int main()
{
int fd;
#ifndef __WIN32
socklen_t sock_len;
#else
int sock_len;
//初始化套接字环境
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("初始化套接字失败!");
return 0;
}
#endif
sockaddr_in serverAddr, clientAddr;
sock_len = sizeof(clientAddr);
//创建一个TCP连接
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd == -1)
{
printf("创建套接子失败!");
return 0;
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(4567);
#ifndef __WIN32
serverAddr.sin_addr.s_addr = INADDR_ANY;
#else
serverAddr.sin_addr.S_un.S_addr = INADDR_ANY;
#endif
//绑定端口
bind(fd, (sockaddr *)&serverAddr, sizeof(serverAddr));
//监听端口
listen(fd, 20);
//接受客户信息
int client = accept(fd, (sockaddr *)&clientAddr, (socklen_t*)&sock_len);
char str[256] = {0};
recv(client, str, sizeof(str), 0);
printf("%s\n", str);
strcat(str, " ... from server");
send(client, str, sizeof(str), 0);
//关闭连接
#ifndef __WIN32
close(client);
close(fd);
#else
closesocket(client);
closesocket(fd);
WSACleanup();
#endif
return 0;
}
客户端
#ifndef __WIN32
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> //inet_addr()
#include <unistd.h>
#else
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#endif
#include <string.h>
#include <stdio.h>
#define PORT 4567
int main()
{
int fd;
#ifndef __WIN32
socklen_t sock_len;
#else
int sock_len;
//初始化套接字环境
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("初始化套接字失败!");
return 0;
}
#endif
sockaddr_in clientAddr;
char ip[16];
sock_len = sizeof(clientAddr);
//创建一个TCP连接
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd == -1)
{
printf("创建套接子失败!");
return 0;
}
clientAddr.sin_family = AF_INET;
clientAddr.sin_port = htons(PORT);
//动态指定主机IP
printf("Please enter IP address:");
scanf("%s", &ip);
#ifndef __Win32
clientAddr.sin_addr.s_addr = inet_addr(ip);
#else
clientAddr.sin_addr.S_un.S_addr = inet_addr(ip);
#endif
//连接服务器
if (connect(fd, (sockaddr *)&clientAddr, sock_len) == -1)
{
printf("与服务器连接失败");
#ifndef __WIN32
close(fd);
#else
closesocket(fd);
#endif
}
const char *msg = "I'm from client";
char buff[256];
//发送消息
send(fd, msg, strlen(msg) + 1, 0);
recv(fd, buff, sizeof(buff), 0);
printf("%s\n", buff);
//关闭连接
#ifndef __WIN32
close(fd);
#else
closesocket(fd);
WSACleanup();
#endif
return 0;
}
版权声明:本文为liouyi250原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。