linux系统编程-SOCKET通信基础编程(0)-常用数据结构
linux系统编程-SOCKET通信基础编程(1)-TCP客户端创建
linux系统编程-SOCKET通信基础编程(2)-TCP服务端创建
1.客户端创建流程
原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部);
两个重要的类型是 SOCK_STREAM 和 SOCK_DGRAM。 SOCK_STREAM表明数据象字符流 一样通过 socket 。而 SOCK_DGRAM 则表明数据将是数据报(datagrams)的形式。
socket 本身就时一个整型值,相当于一个文件描述符
1.1头文件
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
1.2客户端-创建socket对象
int socket(int domain, int type, int protocol);
server_sock = socket(AF_INET, SOCK_STREAM, 0); // SOCK_STREAM 流套接口
1.3客户端-向服务端发送链接请求
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
ret = connect(client_sock,(struct sockaddr *)&server_addr, sizeof(server_addr));
1.4客户端-服务端发送消息
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ret = send(client_sock, buf, strlen(buf), 0);
1.5客户端-接收服务端消息
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ret = recv(client_sock, buf, BUFLEN, 0);
1.6客户端-关闭soket对象
close(socket);
1.7客户端-完整例程
#include <stdio.h>
#include <string.h>
#include <errno.h>
/* 相关头文件 */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERVER_PORT 6666
#define BUFLEN 256
int main()
{
int ret = 0;
char buf[BUFLEN] = {0};
//1,创建socket
int client_sock = socket(AF_INET, SOCK_STREAM, 0);
if(client_sock < 0)
{
perror("socket");
goto SOCK_ERR;
}
//2,填充充服务器的地址信息
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
//server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
//
//server_addr.sin_addr.s_addr = inet_addr("192.168.1.223");
//3,连接服务器
ret = connect(client_sock,(struct sockaddr *)&server_addr, sizeof(server_addr));
if(ret < 0)
{
perror("connect");
goto SOCK_ERR;
}
//4,发送数据
strcpy(buf, "I am a client\n");
ret = send(client_sock, buf, strlen(buf), 0);
if(ret < 0)
{
perror("send");
goto SOCK_ERR;
}
//5,接收数据
bzero(buf, BUFLEN);
ret = recv(client_sock, buf, BUFLEN, 0);
if(ret < 0)
{
perror("recv");
goto SOCK_ERR;
}
printf("recv msg from server:%s\n", buf);
//6,关闭连接
close(client_sock);
SOCK_ERR:
return 0;
}