摘要
- 为了后面能够很好的查找和参考实现一个简单的服务器和客户端,使用了socket编程中的基本函数. 实现了TCP和UDP两种版本
- 这一部分仅就实现最核心的功能,连接并且通信.后续更多功能(并发,IO复用)再慢慢总结
- 对下面的内容有问题请移步参考Linux网络编程基础API
- 运行环境为Linux
socket编程实践(1)
TCP
服务器端
#include<cstdio>
#include<cstdlib>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<cstring>
void show_error(char * info){
printf(info);
exit(-1);
}
int main(int argc,char * argv[])
{
if(argc < 2){
printf("Usage: %s <port>\n",argv[0]);
exit(-1);
}
int listenfd = socket(PF_INET,SOCK_STREAM,0);
if(listenfd == -1){
show_error("socket() error!");
}
struct sockaddr_in serv_addr;
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(atoi(argv[1]));
int ret = bind(listenfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
if(ret == -1){
show_error("bind() error!");
}
ret = listen(listenfd,5);
if(ret == -1){
show_error("listen() error!");
}
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_sz = sizeof(clnt_addr);
int clnt_sock = accept(listenfd,(struct sockaddr*)&clnt_addr,&clnt_addr_sz);
if(clnt_sock == -1){
show_error("accept() error!");
}
else{
printf("get a connection %d\n",clnt_sock);
}
char buffer[128];
ret = read(clnt_sock,buffer,sizeof(buffer));
if(ret < 0){
show_error("read() error!");
}
else if(ret == 0){
printf("client close the connection!");
}
else{
printf("from %d data %d bytes: %s\n",clnt_sock,ret,buffer);
}
close(clnt_sock);
close(listenfd);
}
客户端
#include<cstdio>
#include<cstdlib>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<cstring>
void show_error(char * info){
printf(info);
exit(-1);
}
int main(int argc,char * argv[])
{
if(argc < 3){
printf("Usage: %s <ip> <port>\n",argv[0]);
exit(-1);
}
int clnt_sock = socket(PF_INET,SOCK_STREAM,0);
if(clnt_sock == -1){
show_error("socket() error!");
}
struct sockaddr_in serv_addr;
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_port = htons(atoi(argv[2]));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
int ret = connect(clnt_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
if(ret == -1){
show_error("connect() error!");
}
else{
printf("connect to %s success!\n",argv[1]);
}
char buffer[128] = "hello server!!!";
ret = write(clnt_sock,buffer,sizeof(buffer));
if(ret < 0){
show_error("write() error!");
}
else{
printf("send data success!\n");
}
close(clnt_sock);
}
UDP
服务器端
#include<cstdio>
#include<cstdlib>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<cstring>
void show_error(char * info){
printf(info);
exit(-1);
}
int main(int argc,char * argv[])
{
if(argc < 2){
printf("Usage: %s <port>\n",argv[0]);
exit(-1);
}
int serv_sock = socket(PF_INET,SOCK_DGRAM,0);
if(serv_sock == -1){
show_error("socket() error!");
}
struct sockaddr_in serv_addr;
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(atoi(argv[1]));
int ret = bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
if(ret == -1){
show_error("bind() error!");
}
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_sz = sizeof(clnt_addr);
char buffer[128];
ret = recvfrom(serv_sock,buffer,sizeof(buffer),0,(sockaddr*)&clnt_addr,&clnt_addr_sz);
if(ret < 0){
show_error("read() error!");
}
else if(ret == 0){
printf("client close the connection!");
}
else{
printf("from %s data %d bytes: %s\n",inet_ntoa(clnt_addr.sin_addr),ret,buffer);
}
close(serv_sock);
}
客户端
#include<cstdio>
#include<cstdlib>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<cstring>
void show_error(char * info){
printf(info);
exit(-1);
}
int main(int argc,char * argv[])
{
if(argc < 3){
printf("Usage: %s <ip> <port>\n",argv[0]);
exit(-1);
}
int clnt_sock = socket(PF_INET,SOCK_DGRAM,0);
if(clnt_sock == -1){
show_error("socket() error!");
}
struct sockaddr_in serv_addr;
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_port = htons(atoi(argv[2]));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
char buffer[128] = "hello server!!!";
int ret = sendto(clnt_sock,buffer,sizeof(buffer),0,(sockaddr*)&serv_addr,sizeof(serv_addr));
if(ret < 0){
show_error("sendto() error!");
}
else{
printf("send data success!\n");
}
close(clnt_sock);
}