tcp

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>


#define MYPORT 6666 //1024以下的是保留的端口号,用大于1024的;

#define MYADDR "192.168.1.102"

//服务器

int main()
{
int ret = 0;
int socketfd = 0; //局部变量保存在栈空间,而栈空间是脏的==》里面还是保存的是上一次这个区域里面保存的值;
int clientfd = 0;

struct sockaddr_in sock_server = {0};   //变量类型保存在netinet/in.h里面的;
struct sockaddr_in sock_client = {0}; //保存连接的客户端那边的信息;

socklen_t len = sizeof(struct sockaddr);

//第一步:创建套接字;
socketfd = socket(AF_INET,SOCK_STREAM,0);
if(socketfd == -1)
{
perror("socket");
// printf("socket error!\n");
return -1;
}
printf("socket success...\n"); //确保前面的代码是运行正确的;

//第二步:给套接字绑定必要的信息;
sock_server.sin_family = AF_INET; //给服务程序绑定地址族;
sock_server.sin_port = htons(MYPORT); //给服务器程序设定个端口号;
sock_server.sin_addr.s_addr = inet_addr(MYADDR);//给服务程序绑定IP地址;

ret = bind(socketfd,(struct sockaddr *)&sock_server,sizeof(struct sockaddr));
if(ret == -1)
{
perror("bind");
return -1;
}
printf("bind success..\n");

ret = listen(socketfd,10);
if(ret == -1)
{
perror("listen");
return -1;
}
printf("listen success...\n");

clientfd = accept(socketfd,(struct sockaddr *)&sock_client,&len);
if(clientfd == -1)
{
perror("accept");
return -1;
}
printf("accept success...clinet fd = %d\n",clientfd);

char recvbuff[20] = {0};
int recvcnt = 0;

printf("sizeof(struct sockaddr) = %d\n",sizeof(struct sockaddr));
printf("sizeof(struct sockaddr_in) = %d\n",sizeof(struct sockaddr_in));
while(1)
{
// printf("strlen(recvbuff) = %d\n",strlen(recvbuff));
bzero(recvbuff,sizeof(recvbuff));

// recvcnt = recv(clientfd,recvbuff,sizeof(recvbuff),0);
recvcnt = read(clientfd,recvbuff,sizeof(recvbuff));
if(recvcnt == -1)
{
perror("recv");
return -1;
}
else
{
printf("Recv from Client %d bytes,data:%s\n",recvcnt,recvbuff);
}
if(strcmp(recvbuff,"end") == 0)
{
close(clientfd);
close(socketfd);
break;
}
}

return 0;
}


//服务器

int main()
{
int socketfd = 0;
int ret = 0;

struct sockaddr_in sock_server = {0};

socketfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == socketfd)
{
perror("socket");
return -1;
}
printf("socket success...\n");

//用sock_server提醒你们这边连接的是服务器端的IP地址和端口号;
sock_server.sin_family = AF_INET;
sock_server.sin_port = htons(MYPORT);
sock_server.sin_addr.s_addr = inet_addr(MYADDR);
ret = connect(socketfd,(struct sockaddr *)&sock_server,sizeof(struct sockaddr));
if(ret == -1)
{
perror("connect");
return -1;
}

char sendbuff[20] = {0};
int sendcnt = 0;

while(1)
{
//第一步:提示客户输入要发送的数据;
printf("Please input a string:\n");
scanf("%s",sendbuff);

//第二步:调用send向套接字发送数据;
// sendcnt = send(socketfd,sendbuff,strlen(sendbuff),0);
sendcnt = write(socketfd,sendbuff,strlen(sendbuff));
if(sendcnt == -1)
{
perror("send");
return -1;
}
else
{
printf("Send to Server %d bytes,data:%s\n",sendcnt,sendbuff);
}
//第三步:判断发送的数据是否是end,如果是,就结束;
if(strcmp(sendbuff,"end") == 0)
{
close(socketfd);
break;
}
}

return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值