/******* 服务器程序 (server.c) ************/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
int
main (int argc, char *argv[])
{
int sockfd, new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size, portnumber;
char hello[] = "Hello! Are You Fine?\n";
if (argc != 2)
{
fprintf (stderr, "Usage:%s portnumber\a\n", argv[0]);
exit (1);
}
if ((portnumber = atoi (argv[1])) < 0)
{
fprintf (stderr, "Usage:%s portnumber\a\n", argv[0]);
exit (1);
}
/* 服务器端开始建立socket描述符 */
if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
fprintf (stderr, "Socket error:%s\n\a", strerror (errno));
exit (1);
}
/* 服务器端填充 sockaddr结构 */
bzero (&server_addr, sizeof (struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl (INADDR_ANY);
server_addr.sin_port = htons (portnumber);
/* 捆绑sockfd描述符 */
if (bind
(sockfd, (struct sockaddr *) (&server_addr),
sizeof (struct sockaddr)) ==
-1)
{
fprintf (stderr, "Bind error:%s\n\a", strerror (errno));
exit (1);
}
/* 监听sockfd描述符 */
if (listen (sockfd, 5) == -1)
{
fprintf (stderr, "Listen error:%s\n\a", strerror (errno));
exit (1);
}
while (1)
{
/* 服务器阻塞,直到客户程序建立连接 */
sin_size = sizeof (struct sockaddr_in);
if ((new_fd =
accept (sockfd, (struct sockaddr *) (&client_addr),
&sin_size)) == -1)
{
fprintf (stderr, "Accept error:%s\n\a", strerror (errno));
exit (1);
}
fprintf (stderr, "Server get connection from %s\n",
inet_ntoa (client_addr.sin_addr));
if (write (new_fd, hello, strlen (hello)) == -1)
{
fprintf (stderr, "Write Error:%s\n", strerror (errno));
exit (1);
}
/* 这个通讯已经结束 */
close (new_fd);
/* 循环下一个 */
}
close (sockfd);
exit (0);
}
/******* 客户端程序 client.c ************/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
int
main (int argc, char *argv[])
{
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber, nbytes;
if (argc != 3)
{
fprintf (stderr, "Usage:%s hostname portnumber\a\n", argv[0]);
exit (1);
}
if ((host = gethostbyname (argv[1])) == NULL)
{
fprintf (stderr, "Gethostname error\n");
exit (1);
}
if ((portnumber = atoi (argv[2])) < 0)
{
fprintf (stderr, "Usage:%s hostname portnumber\a\n", argv[0]);
exit (1);
}
/* 客户程序开始建立 sockfd描述符 */
if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
fprintf (stderr, "Socket Error:%s\a\n", strerror (errno));
exit (1);
}
/* 客户程序填充服务端的资料 */
bzero (&server_addr, sizeof (server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons (portnumber);
server_addr.sin_addr = *((struct in_addr *) host->h_addr);
/* 客户程序发起连接请求 */
if (connect
(sockfd, (struct sockaddr *) (&server_addr),
sizeof (struct sockaddr)
) == -1)
{
fprintf (stderr, "Connect Error:%s\a\n", strerror (errno));
exit (1);
}
/* 连接成功了 */
if ((nbytes = read (sockfd, buffer, 1024)) == -1)
{
fprintf (stderr, "Read Error:%s\n", strerror (errno));
exit (1);
}
buffer[nbytes] = '\0';
printf ("I have received:%s\n", buffer);
/* 结束通讯 */
close (sockfd);
exit (0);
}
分享到:
相关推荐
在Windows环境下进行C语言编程,Socket是实现网络通信的基础接口,它允许程序通过网络发送和接收数据。本教程将深入探讨如何使用C语言在Windows操作系统上构建简单的TCP服务器和客户端。 首先,我们要了解socket的...
在本资源中,包含了Linux C语言和Windows C#平台下的服务器和客户端程序,覆盖了TCP协议的实现。接下来,我们将深入探讨这些知识点。 1. **Socket接口**: Socket是操作系统提供的一个接口,它允许应用程序通过...
一个开源的高性能IOCP(完成端口)网络通信封装框架《HP-Socket》的使用实例,官方的DEMO只有MFC对话框的版本,对于刚接触这个框架的新手不太容易把代码移植到自己的项目。 此DEMO使用标准C++控制台来实现,对于刚...
在Windows环境下进行C语言网络编程,首先需要具备一定的C语言基础和对计算机系统的基本理解。在传统的C语言学习路径中,通常会先学习C语言,然后是C++,再逐步涉及汇编语言和微机原理。然而,对于Windows C编程,你...
在`Socket编程例子_MFC`这个压缩包中,可能包含了一个简单的C/S程序示例,展示了如何在MFC工程中集成Socket通信。可能包含客户端的`.cpp`和`.h`文件,以及服务器端的相应文件。代码中可能使用了`CSocket`类及其派生...
在Windows下,这通常涉及调用`WSAStartup()`函数,传入版本信息和一个指向WSADATA结构的指针,用于获取WSA的详细信息。 2. **创建SOCKET**:接着,我们需要创建一个SOCKET实例。可以使用`socket()`函数,传入地址族...
这涉及到网络编程,C语言可以用于编写底层的网络应用,比如处理TCP/IP协议栈,进行socket通信。这个程序可能是通过调用操作系统提供的API来实现IP地址的设置,展示了C语言在系统编程中的应用。 最后,"说明.txt"很...
在Windows和Linux等操作系统中,可以使用`socket()`函数创建一个原始套接字。在创建时,需要指定套接字类型为`SOCK_RAW`,并指定相应的协议,例如` IPPROTO_IP`(用于IP层操作)或` IPPROTO_TCP`/` IPPROTO_UDP`...
### Windows 下 C 语言网络编程快速入门 在 Windows 平台上使用 C 语言进行网络编程是一种常见的技术手段,尤其对于那些需要与操作系统底层交互的应用程序来说尤为重要。本文将基于提供的内容,详细介绍 Windows 下...
在这个例子中,我们可能需要使用流式Socket,因为它提供了一种面向连接、可靠的通信方式。 接下来,服务端需要调用`bind()`函数将Socket与一个特定的IP地址和端口号绑定。然后,使用`listen()`函数设置Socket为监听...
总结,"Windows C语言库函数使用手册"是一份涵盖Windows平台上C语言编程必备知识的资源,通过深入学习和实践,开发者可以掌握在Windows环境下编写高效、稳定的应用程序所需的技能。这份手册应包含详尽的函数介绍、...
而"C#高性能大容量SOCKET并发完成端口例子完整实例源码"则是本次讨论的核心,包含了具体的C#代码实现,你可以通过阅读和分析这些源码,深入理解如何在C#中利用完成端口实现高效的Socket并发处理。
DOS平台下的TCP/IP编程主要依赖于WATTCP函数库,这是一个由加拿大Waterloo大学的Erick Engelke开发的C语言函数库。与Unix Socket相比,WATTCP提供了一个更简单直观的编程接口。由于DOS缺乏强大的网络文件系统,因此...
为了更好地理解 UNIX 和 Windows Socket 编程之间的区别,我们将通过一个具体的例子——TCP Echo 客户端来演示: #### 3.1 UNIX 版本 ```c #include <sys/socket.h> #include #include int main(int argc, char ...
这个"Socket编程经典例子源码.zip"文件包含了一些使用Visual C++编写的示例代码,用于帮助初学者理解和掌握Socket编程的基本概念和操作。让我们深入探讨一下Socket编程、TCP通信以及在C++环境下的实现。 Socket,...
1. 包含两个例子本人在comsenseEXP上运行过木有问题。 2. 例子syn是采用阻塞模式做的 3. 例子select是采用select(非阻塞模式)做的。 运行方法: a.安装comsenseEXP,配置windows上php环境变量(目的是使得win...
在Windows环境下,UDP(User Datagram Protocol)套接字是网络编程中的一个重要概念,它主要用于实现无...通过理解这些基础概念和函数,你可以分析并学习这两个源码文件,进一步掌握UDP套接字在Windows下的C语言实现。