标题:
SOkit的C语言源程序
[打印本页]
作者:
a13396561254
时间:
2019-6-30 22:25
标题:
SOkit的C语言源程序
有用的sokit
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#define PORT 4321
#define BUF_SIZE 1024
int main(int argc, char *argv[])
{
int sockfd, sendbytes, recvbytes;
char buf[BUF_SIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
if(argc<2)
{// 检查程序参数个
printf("USAGE: ./tclient Hostname(or ip address)\n");
exit(1);
}
//检查程序参数指定的服务器地止
if((host = gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{// 创建一个流
socket perror("socket");
exit(1);
}
//初始化serv_addr结构体变
serv_addr.sin_family = AF_INET;
serv_addr.sin_port=htons(PORT);
serv_addr.sin_addr=*((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero), 8);
// 连接服务
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1)
{perror("connect");
exit(1);
}// 显示连接信
printf("connect to server %s...\nInput the msg to send:\n", argv[1]);
while (1)
{ // 循环发送、接收服务器信
bzero(buf, sizeof(buf));// 清空缓
if(fgets(buf, BUF_SIZE, stdin)) {
// 终端输入一行数据
if (strcmp(buf, "exit\n") == 0) break;// 判断是否退出循
if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)
{ // 是否发送成功
perror("send");
exit(1);
}
}
bzero(buf, sizeof(buf));// 清空缓冲
if((recvbytes = recv(sockfd, buf, BUF_SIZE, 0)) == -1)
{
// 等待接收数据
perror("recv");
exit(1);
}
else printf("receive from %d(socket): %s\n", sockfd, buf); // 打印接收数据 }
close(sockfd);// 关闭
socket return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<time.h>
#include <string.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#define PORT 4321
#define MAX_QUE_CONN_NM 5
#define MAX_SOCK_FD FD_SETSIZE
#define BUFFER_SIZE 1024
#define HOSTLEN 256
int main()
{
struct sockaddr_in server_sockaddr, client_sockaddr;
int sin_size, count;
fd_set inset, tmp_inset;
int sockfd, client_fd, fd;
char buf[BUFFER_SIZE];
// 接收、发送缓
struct sockaddr_in scinf[100];
// 客户端地址池
bzero((void *)scinf, sizeof(scinf));
// 创建
socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
// 初始化服务器地址结构体
server_sockaddr.sin_family=AF_INET;
server_sockaddr.sin_port=htons(PORT);
server_sockaddr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_sockaddr.sin_zero), 8);
// 为bind设置地址复用
int i = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
if(bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
// 开始侦听客户端连
if(listen(sockfd, MAX_QUE_CONN_NM) == -1)
{
perror("listen");
exit(1);
}
printf("Begin listening...\n");
// 准备非阻塞方式连接多路客户端
FD_ZERO(&inset);
FD_SET(sockfd, &inset);
while (1)
{
tmp_inset = inset;
sin_size = sizeof(struct sockaddr_in);
memset(buf, 0, sizeof(buf));
if(!(select(MAX_SOCK_FD, &tmp_inset, NULL, NULL, NULL) > 0))
{//等待网络消息
perror("select");
exit(1);
}
for(fd = 0; fd < MAX_SOCK_FD; ++fd)
{
if (FD_ISSET(fd, &tmp_inset) > 0)
{
if (fd == sockfd)
{// 有客户端连接请求,accept
if((client_fd = accept(sockfd, (struct sockaddr*)&client_sockaddr, &sin_size))==-1)
{
perror("accept");
exit(1);
}
FD_SET(client_fd, &inset);
printf("New connection from %s\n", inet_ntoa(client_sockaddr.sin_addr));
if(client_fd < 100 && client_fd >= 0)// 新连接客户端记入地址
memcpy((void *)(&scinf[client_fd]), (void *)&client_sockaddr, sin_size);
}
ellse
{
// 有客户端数据
if((count = recv(fd, buf, BUFFER_SIZE, 0)) > 0)
{// 接收数
if(fd >= 0 && fd < 100)
printf("Received from %s:\t%s\n", inet_ntoa(scinf[fd].sin_addr), buf);
if((count = send(fd, buf, strlen(buf), 0)) == -1)
{ // 回送数据
perror("send");
exit(1);
}
}
else
{// 无法读取数据,可能连接以断
if(fd >= 0 && fd < 100)
printf("Client %s has left\n", inet_ntoa(scinf[fd].sin_addr));
memset((void *)(&scinf[client_fd]), 0, sin_size);
close(fd);
FD_CLR(fd, &inset);
}
}
}
}
}
close(sockfd); return 0;
}
复制代码
sokit.zip
2019-6-30 22:25 上传
点击文件名下载附件
下载积分: 黑币 -5
3.9 MB, 下载次数: 4, 下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1