server/client socket with vc/*@file client.c
*windows socket include tcp/ip
*compiled ok with vc++6.0
*客户端socket流程
*1.初始化socket
*2.建立socket
*3.连接socket
*4.发送消息
*5.接收消息
*6.清理socket
*/
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
int main(int argc, char* argv[]){
//0.定义结构与变量
HOSTENT *host_entry;
char host_name[256];
int n;
struct WSAData wsadata;
int sock;
struct sockaddr_in srvaddr;
struct hostent *hp;
char data[1024];
char c;
int i = 0;
if ( argc < 3 )
{
printf("Usage : %s ip port/n", argv[0]);
exit(1);
}
//1.初始化socket
if ( WSAStartup(0x0101, &wsadata) == 0)
{
n = gethostname(host_name, 256);
host_entry = gethostbyname(host_name);
if ( host_entry != NULL )
{
printf("%d.%d.%d.%d/n",
host_entry->h_addr_list[0][0]&0x00ff,
host_entry->h_addr_list[0][1]&0x00ff,
host_entry->h_addr_list[0][2]&0x00ff,
host_entry->h_addr_list[0][3]&0x00ff);
}
//2.建立socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if ( sock < 0 )
{
printf("socket create error./n");
exit(1);
}
srvaddr.sin_family = AF_INET;
hp = gethostbyname(argv[1]);
if ( hp == 0 )
{
printf("unknow host : %s/n", argv[1]);
exit(1);
}
memcpy((char*)&srvaddr.sin_addr, (char*)hp->h_addr, hp->h_length);
srvaddr.sin_port = htons((unsigned short)atoi(argv[2]));
//3.连接socket
if ( connect(sock, (struct sockaddr*)&srvaddr, sizeof(srvaddr)) < 0 )
{
printf("connect server error./n");
exit(1);
}
while ( 1 )
{
memset(data, 0, 1024);
i = 0;
c = getchar();
while ( c != 10 )
{
data[i++] = c;
c = getchar();
}
data[i] = '/0';
//4.发送消息
if ( send(sock, data, sizeof(data), 0) < 0 )
{
printf("send data error./n");
exit(1);
}
//5.接收消息
if (recv(sock, data, 1024, 0) )
{
printf("----->%s/n", data);
}
if ( strcmp(data, "bye") == 0 )
{
closesocket(sock);
printf("connecting close./n");
WSACleanup();
exit(0);
}
}
}
WSACleanup();
return 0;
}
/*********************************************************************/
/*@file server.c
*windows socket include tcp/ip
*compiled ok with vc++6.0
*服务器socket流程
*1.初始化socket
*2.绑定socket
*3.监听socket
*4.回应socket
*5.接收消息
*6.发送消息
*7.清理socket
*/
#include <stdio.h>
#include <winsock2.h>
#include <time.h>
#pragma comment(lib, "ws2_32.lib")
int main(){
//0.定义结构与变量
HOSTENT *host_entry;
char host_name[256];
int n;
struct WSAData wsadata;
int sock, length;
struct sockaddr_in srvaddr;
struct sockaddr tcpaddr;
int msgsock;
char buf[1024];
int rval, len;
char c;
char data[1024];
int i;
clock_t t_start = clock();
//1.初始化socket
if ( WSAStartup(0x0101, &wsadata) == 0)
{
n = gethostname(host_name, 256);
host_entry = gethostbyname(host_name);
if ( host_entry != NULL )
{
printf("%d.%d.%d.%d/n",
host_entry->h_addr_list[0][0]&0x00ff,
host_entry->h_addr_list[0][1]&0x00ff,
host_entry->h_addr_list[0][2]&0x00ff,
host_entry->h_addr_list[0][3]&0x00ff);
}
printf("Establish connecting & listening..../n");
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0 )
{
printf("open socket error/n");
exit(1);
}
memset(&srvaddr, 0, sizeof(struct sockaddr) );
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(5500);
//2.绑定socket
if ( bind(sock, (struct sockaddr*)&srvaddr, sizeof(srvaddr)) < 0 )
{
printf("socket bind error./n");
exit(1);
}
length = sizeof(srvaddr);
if ( getsockname(sock, (struct sockaddr*)&srvaddr, &length ) < 0 )
{
printf("get sock name error./n");
exit(1);
}
printf("listening port: #%d/n", ntohs(srvaddr.sin_port));
//3.监听socket
listen(sock, 5);
len = sizeof(struct sockaddr);
do {
//4.回应socket
msgsock = accept(sock, (struct sockaddr*)&tcpaddr, (int*)&len);
if ( msgsock == -1 )
{
printf("error accept./n");
}
else
do {
if ( clock() - t_start > 40000 )
{
closesocket(msgsock);
WSACleanup();
printf("time out./n");
exit(0);
}
memset(buf, 0, sizeof(buf));
//5.接收消息
if (( rval = recv(msgsock, buf, 1024, 0)) < 0 )
{
printf("recv sock msg error./n");
}
if ( rval == 0 )
{
printf("ending connecting./n");
closesocket(msgsock);
WSACleanup();
exit(1);
}
else
{
t_start = clock();
printf("--->%s/n", buf);
}
memset(data, 0, 1024);
i = 0;
c = getchar();
while ( c != 10 )
{
data[i++] = c;
c = getchar();
}
data[i] = '/0';
//6.发送消息
send(msgsock, data, sizeof(data), 0);
t_start = clock();
if ( strcmp(buf, "bye") == 0 )
{
closesocket(msgsock);
WSACleanup();
exit(1);
}
} while(rval != 0);
closesocket(msgsock);
} while(1);
}
//7.清理socket
WSACleanup();
return 0;
}
win32局域网命令行方式聊天程序C实现
最新推荐文章于 2021-05-18 04:34:21 发布