目录
第一步socket
1.操作:创建流式套接字;
2.所用函数:socket;
socket(AF_INET,SOCK_STREAM,0);
3.函数参数:AF_INET代表所使用的网际协议版本ipv4;
SOCK_STREAM代表创建的是流式套接字;
0为自动匹配该项;
4.返回值:sockfd返回值小于0时,创建失败;
int sockfd;
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < -1)
{
perror("socket err");
return -1;
}
printf("socket sucess\n");
第二步struct sockaddr_in
1.操作:填充结构体;
2.结构体:struct sockaddr_in;
要填充的成员变量:sin_family - 所使用的网际协议版本;
sin_port - 端口号;sin_addr.s_addr - ip;
struct sockaddr_in serveraddr,clientaddr;
serveraddr.sin_family = AF_INET; //使用的是ipv4地址
//htons函数将主机字节序转换为网络字节序,atoi函数将字符串端口号转换为数字端口号
serveraddr.sin_port = htons(atoi(argv[1]));
serveraddr.sin_addr.s_addr = inet_addr("0.0.0.0");//32位的IP地址
第三步connect
1.操作:连接服务器;
2.所用函数:connect;
connect(sockfd,(struct sockaddr *)&serverddr,sizeof(serveraddr));
3.函数参数:
sockfd - 套接字描述符;
(struct sockaddr *)&serveraddr - 服务器地址;
sizeof(serveraddr) - 服务器地址大小;
4.返回值:connect返回值小于0时,绑定失败;
int connect_t;
connect_t = connect(sockfd, (struct sockaddr *)&clientaddr, sizeof(clientaddr));
if (connect_t < 0)
{
perror("connect err");
return -1;
}
printf("connect sucess\n");
第四步send
1.操作:向服务器发送消息;
2.所用函数:send;
send(sockfd,buf,sizeof(buf),0);
3.函数参数:
sockfd - 套接字描述符;
buf - 发送的数据保存在该数组;
sizeof(buf) - 数组大小;
0 - 与recv的参数作用相同,起堵塞和非堵塞的作用;
fgets(buf, sizeof(buf), stdin);
if (buf[strlen(buf) - 1] == '\n')
{
buf[strlen(buf) - 1] = '\0';
}
send(sockfd, buf, sizeof(buf), 0);
第五步close
1.操作:关闭描述符;
2.所用函数:close;
close(sockfd);
详细代码
/********
*客户端代码
*client.c
*********/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <wait.h>
int main(int argc, char const *argv[])
{
if (argc != 3)
{
printf("input %s <ip> <port>\n", argv[0]);
return -1;
}
char buf[128] = "";
//1.创建流式套接字 socket
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockfd < -1)
{
perror("socket err");
return -1;
}
printf("socket sucess\n");
//2
//填充结构体
struct sockaddr_in clientaddr;
clientaddr.sin_family = AF_INET; //使用ipv4地址
clientaddr.sin_port = htons(atoi(argv[2])); //主机字节序到网络字节序
clientaddr.sin_addr.s_addr = inet_addr(argv[1]); //32位的IP地址
//3.连接服务器
int connect_t;
connect_t = connect(sockfd, (struct sockaddr *)&clientaddr, sizeof(clientaddr));
if (connect_t < 0)
{
perror("connect err");
return -1;
}
printf("connect sucess\n");
//4.发送数据
while (1)
{
fgets(buf, sizeof(buf), stdin);
if (buf[strlen(buf) - 1] == '\n')
{
buf[strlen(buf) - 1] = '\0';
}
send(sockfd, buf, sizeof(buf), 0);
if (strncmp(buf, "quit", 4) == 0)
{
break;
}
}
//关闭
close(sockfd);
return 0;
}