服务端框架
telnet+IP+端口号进行连接
server.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
int main()
{
int s_fd;
int n_read;
char readBuf[128];
char *msg = "I get your connect!";
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
memset(&s_addr,0,sizeof(struct sockaddr_in));
memset(&c_addr,0,sizeof(struct sockaddr_in));
//1.int socket(int domain, int type, int protocol);
//创建一个socket
s_fd = socket(AF_INET,SOCK_STREAM,0);
if(s_fd == -1){
perror("scoket");
exit(-1);
}
//设置socket地址
s_addr.sin_family = AF_INET; //地址族:使用IPv4
s_addr.sin_port = htons(8989); //端口号,使用网络字节序表示
inet_aton("192.168.66.66",&s_addr.sin_addr); //IP地址v4地址,用网络字节序表示
/*struct sockaddr_in
{
sa_family_t sin_family; //地址族:AF_INET
u_int16_t sin_port; //端口号,要使用网络字节序表示
struct in_addr sin_addr; //IPv4地址结构体
char sin_zero[8]; //不使用
}
struct in_addr
{
u_int32_t s_addr; //IPv4地址,要用网络字节序表示
}*/
//分配地址信息,socket命名
//2.int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
//创建一个监听队列
//3.int listen(int sockfd, int backlog);
listen(s_fd,10);
//连接
//4.int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int clen = sizeof(struct sockaddr_in); //大小
int c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen); //强制转换,不然会有警告
if(c_fd == -1){
perror("accept");
}
printf("get connect:%s\n",inet_ntoa(c_addr.sin_addr));
//读取
//5.read
n_read = read(c_fd,readBuf,128);
if(n_read == -1){
perror("read");
}else{
printf("get message:%d,%s\n",n_read,readBuf);
}
//写入
//6.write
write(c_fd,msg,strlen(msg));
//7.close
close(s_fd); //关闭
close(c_fd);
return 0;
}
客户端框架
client.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
int main()
{
int c_fd;
int n_read;
char readBuf[128];
char *msg = "msg from client!";
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
//1.int socket(int domain, int type, int protocol);
c_fd = socket(AF_INET,SOCK_STREAM,0);
if(c_fd == -1){
perror("scoket");
exit(-1);
}
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(8989);
inet_aton("192.168.31.41",&c_addr.sin_addr);
/*struct sockaddr_in
{
sa_family_t sin_family; //地址族:AF_INET
u_int16_t sin_port; //端口号,要使用网络字节序表示
struct in_addr sin_addr; //IPv4地址结构体
char sin_zero[8]; //不使用
}
struct in_addr
{
u_int32_t s_addr; //IPv4地址,要用网络字节序表示
}*/
//客户端不需要绑定和监听,直接连接服务器
//2. int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr)) == -1){ //连接
perror("connect");
exit(-1);
}
//3.send
write(c_fd,msg,strlen(msg));
//4.read
n_read = read(c_fd,readBuf,128);
if(n_read == -1){
perror("read");
}else{
printf("get message from client : %d,%s\n",n_read,readBuf);
}
//5.close
//关闭连接
close(c_fd);
return 0;
}