TCP服务器
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define ERR_MSG(msg)do{\
fprintf(stderr,"line;__%d__ %s %s\n",__LINE__,__FILE__,__func__);\
perror(msg);\
}while(0)
#define IP "192.168.2.15"
#define PORT 6666
int main(int argc, const char *argv[])
{
//创建流式套接字
int sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd < 0)
{
ERR_MSG("socket");
return -1;
}
//端口快速被使用
int reuse = 1;
if( setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
{
ERR_MSG("setsockopt");
return -1;
}
//绑定服务器的IP和端口号
struct sockaddr_in sin;
sin.sin_family = AF_INET; //必须填AF_INET
sin.sin_port = htons(PORT); //服务器的端口号,网络字节序
sin.sin_addr.s_addr = inet_addr(IP); //服务器的IP,网络字节
if (bind(sfd,(struct sockaddr *)&sin,sizeof(sin)) < 0)
{
ERR_MSG("bind");
return -1;
}
printf("bind success __%d__\n",__LINE__);
//把套接字变为监听模式
if (listen(sfd,128) < 0)
{
ERR_MSG("listen");
return -1;
}
printf("listen success __%d__\n",__LINE__);
//连接成功后获得新套接字的描述符
struct sockaddr_in cin; //存储客户端的地址结构体
socklen_t addrlen = sizeof(cin); //地址结构体的大小
int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);
if (newfd < 0)
{
ERR_MSG("accept");
return -1;
}
printf("[%s:%d]客户端连接成功 newfd=%d __%d__\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);
char b[32];
char c[32];
ssize_t res = 0;
while (1)
{ //接收
bzero(b,sizeof(b));
res = recv (newfd,b,sizeof(b),0);
if (0 == res)
{
printf("[%s;%d]客户端已经下线 newfd=%d __%d__\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);
}
if (res < 0)
{
ERR_MSG("recv");
return -1;
}
printf("[%s;%d]%s __%d__\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port), b,__LINE__);
//发送
bzero(c,sizeof(c));
scanf("%s",c);
if(send (newfd,c,sizeof(c),0) < 0)
{
ERR_MSG("send");
return -1;
}
}
//关闭套接字
close(sfd);
close(newfd);
return 0;
}
TCP客户端
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define ERR_MSG(msg)do{\
fprintf(stderr,"line;__%d__ %s %s\n",__LINE__,__FILE__,__func__);\
perror(msg);\
}while(0)
#define IP "192.168.2.15"
#define PORT 6666
int main(int argc, const char *argv[])
{
//创建流式套接字
int cfd = socket(AF_INET,SOCK_STREAM,0);
if(cfd < 0)
{
ERR_MSG("socket");
return -1;
}
//非必要绑定服务器的IP和端口号
//connect连接服务器
struct sockaddr_in cin;
cin.sin_family = AF_INET;
cin.sin_port = htons(PORT);
cin.sin_addr.s_addr = inet_addr(IP);
if (connect(cfd,(struct sockaddr*)&cin,sizeof(cin)) < 0)
{
ERR_MSG("connect");
return -1;
}
printf("[%s:%d]服务器连接成功 __%d__\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),__LINE__);
char b[32];
char c[32];
ssize_t res = 0;
while (1)
{ //发送
bzero(c,sizeof(c));
scanf("%s",c);
if(send (cfd,c,sizeof(c),0) < 0)
{
ERR_MSG("send");
return -1;
}
// 接收
bzero(b,sizeof(b));
res = recv (cfd,b,sizeof(b),0);
if (0 == res)
{
printf("[%s;%d]服务器已经下线 __%d__\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),__LINE__);
}
if (res < 0)
{
ERR_MSG("recv");
return -1;
}
printf("[%s;%d]%s __%d__\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port), b,__LINE__);
}
//关闭套接字
close(cfd);
return 0;
}
UDP服务器
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include<unistd.h>
#define ERR_MSG(msg)do{\
fprintf(stderr,"line:__%d__ %s %s\n",__LINE__,__FILE__,__func__);\
perror(msg);\
}while(0)
#define IP "192.168.2.15"
#define PORT 6666
int main(int argc, const char *argv[])
{
//创建流式套接字
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if (sfd < 0)
{
ERR_MSG("socket");
return -1;
}
//绑定端口号和IP
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr(IP);
if ( bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0 )
{
ERR_MSG("bind");
return -1;
}
printf("bind success __%d__\n",__LINE__);
char b[32];
char c[32];
ssize_t res = 0;
struct sockaddr_in cfd;
socklen_t addrlen = sizeof(cfd);
while (1)
{ //接收
bzero(b,sizeof(b));
res = recvfrom(sfd,b,sizeof(b),0,(struct sockaddr *)&cfd,&addrlen);
if(res < 0)
{
ERR_MSG("recvfrom");
return -1;
}
printf("[%s:%d]%s __%d__ \n",inet_ntoa(cfd.sin_addr),ntohs(cfd.sin_port),b,__LINE__);
//发送
bzero(c,sizeof(c));
scanf("%s",c);
if(sendto(sfd,c,sizeof(c),0,(struct sockaddr *)&cfd,addrlen) < 0)
{
ERR_MSG("sendto");
return -1;
}
printf("sendto success __%d__ \n",__LINE__);
}
//关闭流式套接字
close (sfd);
return 0;
}
UDP客户端
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include<unistd.h>
#define ERR_MSG(msg)do{\
fprintf(stderr,"line:__%d__ %s %s\n",__LINE__,__FILE__,__func__);\
perror(msg);\
}while(0)
#define IP "192.168.2.15"
#define PORT 6666
int main(int argc, const char *argv[])
{
//创建流式套接字
int cfd = socket(AF_INET,SOCK_DGRAM,0);
if (cfd < 0)
{
ERR_MSG("socket");
return -1;
}
//非不要绑定端口号和IP
char b[32];
char c[32];
ssize_t res = 0;
struct sockaddr_in sfd;
sfd.sin_family = AF_INET;
sfd.sin_port = htons(PORT);
sfd.sin_addr.s_addr = inet_addr(IP);
socklen_t addrlen = sizeof(sfd);
while (1)
{ //发送
bzero(c,sizeof(c));
scanf("%s",c);
if(sendto(cfd,c,sizeof(c),0,(struct sockaddr *)&sfd,addrlen) < 0)
{
ERR_MSG("sendto");
return -1;
}
printf("sendto success __%d__ \n",__LINE__);
//接收
bzero(b,sizeof(b));
res = recvfrom(cfd,b,sizeof(b),0,(struct sockaddr *)&sfd,&addrlen);
if(res < 0)
{
ERR_MSG("recvfrom");
return -1;
}
printf("[%s:%d]%s __%d__ \n",inet_ntoa(sfd.sin_addr),ntohs(sfd.sin_port),b,__LINE__);
}
//关闭流式套接字
close (cfd);
return 0;
}
UDP实现